Javascript中的with

来源:互联网 发布:免费地方门户源码 编辑:程序博客网 时间:2024/05/22 04:24

with

with会暂时修改作用域链。

<script>function a(){    with (b) {         ...    }}
a();</script>

函数a在定义的时候,就确定了a的作用域链,我们姑且认为这条链的最顶端是全局对象window。

当函数a被执行的时候,javascript引擎生成了一个call object并将其添加到作用域链尾部上(window对象之后),语句运行到with(b)时,将b添加到作用域链的尾部,所以with之内的变量查找,就会优先从这条链的b上查找---> 然后从a的call object中查找---> 最后查找window。with内的语句执行完之后,作用域链恢复原状(b被移出作用域链)。

以上就是例子代码运行时的微观世界。

with是不被推荐的,因为他操作作用域链,导致with语句之前的变量查找路径变长,执行效率低下。

有些人可能认为with能节省代码量,比如

with(document.forms[0]){    name.value='';    address.value='';    email.value='';}

就能少写不少document.forms[0], 
其实定义一个局部变量取代with中的b也可以达到同样目的,效率也无损失。

var c=document.forms[0];    c.name.value='';    c.address.value='';    c.email.value='';
转自KennyMa的博客
原文链接:http://www.cnblogs.com/kaima/archive/2009/03/11/1408748.html
0 0