Javascript的eval、with

zhanfanpan

zhanfanpan

2016-02-19 16:16

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享Javascript的eval、with吧。

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

  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也可以达到同样目的,效率也无损失。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)

var c=document.forms[0];
    c.name.value='';
    c.address.value='';
    c.email.value='';

展开更多 50%)
分享

猜你喜欢

javascript eval()

Web开发
javascript eval()

Javascript的eval、with

Web开发
Javascript的eval、with

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

javascript之eval函数

Web开发
javascript之eval函数

Javascript中eval函数的详细用法与说明

Web开发
Javascript中eval函数的详细用法与说明

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

eval(function(p,a,c,k,e,d)系列解密javascript程序

Web开发
eval(function(p,a,c,k,e,d)系列解密javascript程序

对JavaScript的eval()中使用函数的进一步讨论

Web开发
对JavaScript的eval()中使用函数的进一步讨论

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

QQ默认表情没有了怎么恢复

QQ默认表情没有了怎么恢复

Q+图标怎么点亮

Q+图标怎么点亮
下拉加载更多内容 ↓