浅谈Javascript中的eval与with
创始人
2024-03-23 05:21:15
0

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

【编辑推荐】

  1. Javascript中的replace方法与正则表达式讲解
  2. 详解Javascript trim()函数实现
  3. 应用最广的十大Javascript框架

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...