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会暂时修改作用域链。

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



相关阅读:
ASP测试WEB服务器
加强Win2003系统安全性从四大方面入手
PHP 在Windows 2003 Enterprise Server 、IIS6.0 下
PHP中=赋值操作符对不同数据类型的不同行为
启动SQLServer的死锁检查
oracle用instr代替like
Linux下常用cvs命令整理
MYSQL 没有完全卸载将导致其安装不成功
CSS样式表教程:浏览器默认样式
SQL SERVER 2005 最小安装经验
XHTML入门学习教程:表格标签的应用
js下获取div中的数据的原理分析
VBS教程:函数-Exp 函数
javascript 操作文件 实现方法小结
快速导航

Copyright © 2016 phpStudy | 皖ICP备18014864号-4