Javascript的eval、with

简介:

上一篇向高级Javascript程序员阵营迈进:Javascript一些概念研究总结提到,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能节省代码量,比如

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


本文转自Kai的世界,道法自然博客园博客,原文链接:http://www.cnblogs.com/kaima/archive/2009/03/11/1408748.html,如需转载请自行联系原作者。

目录
相关文章
|
3月前
|
JSON JavaScript 小程序
js中eval()的使用说明
js中eval()的使用说明
|
6月前
|
Web App开发 JavaScript 前端开发
Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ‘eval‘ 是什么含义
Chrome 开发者工具里根据关键字搜索,结果列表里的 JavaScript 文件名后面跟的 ‘eval‘ 是什么含义
48 0
|
3月前
|
移动开发 JavaScript 前端开发
原生JavaScript+CSS实现计算器(简单的介绍一下eval函数)
原生JavaScript+CSS实现计算器(简单的介绍一下eval函数)
28 0
|
4月前
|
JSON JavaScript Go
js中eval
js中eval
21 0
|
8月前
|
自然语言处理 JavaScript 前端开发
JavaScript中eval和with语句如何影响作用域链:探索深度知识
JavaScript中eval和with语句如何影响作用域链:探索深度知识
|
8月前
|
JavaScript
JS eval() 动态执行函数
JS eval() 动态执行函数
45 0
|
JavaScript 前端开发 Shell
开发中切忌使用的JavaScript语句 —— with语句 和 eval语句
开发中切忌使用的JavaScript语句 —— with语句 和 eval语句
113 0
|
JavaScript 前端开发
用Eval实现基本运算——Javascript
用Eval实现基本运算——Javascript
64 0
用Eval实现基本运算——Javascript
|
自然语言处理 JavaScript 前端开发
JavaScript 中 Eval 函数的前世今生,执行代码字符串
JavaScript 中 Eval 函数的前世今生,执行代码字符串
78 0
JavaScript 中 Eval 函数的前世今生,执行代码字符串