快捷搜索:

Javascript的eval、with

javascript的感化域是词法感化域(lexical scope or static scope),也便是说感化域链在定义的时刻就确定了。也提到eval、with会扰乱感化域链(dynamic scope)。

eval

IE下:运行eval()会受当前感化域限定,运行execScript()则疏忽当前感化域,直接在全局感化域下履行。

Firefox下:eval()和window.eval()效果不一样,这很稀罕,终究FF下,eval==window.eval。前者会受当前感化域限定,后者疏忽当前感化域,在全局感化域下履行(相称于IE的execScript())。

有人写了一篇对照普通的,参考这篇文章

with

with会暂时改动感化域链。

函数a在定义的时刻,就确定了a的感化域链,我们姑且觉得这条链的最顶端是全局工具window。

当函数a被履行的时刻,javascript引擎天生了一个call object并将其添加到感化域链尾部上(window工具之后),语句运行到with(b)时,将b添加到感化域链的尾部,以是with之内的变量查找,就会优先从这条链的b上查找---> 然后从a的call object中查找---> 着末查找window。with内的语句履行完之后,感化域链恢回覆再起状(b被移出感化域链)。

以上便是例子代码运行时的微不雅天下。

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='';

出处:http://kaima.cnblogs.com

您可能还会对下面的文章感兴趣: