Javascript的eval、with

2016-02-19 16:16 7 1 收藏

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

【 tulaoshi.com - Web开发 】

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

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

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],

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

  其实定义一个局部变量取代with中的b也可以达到同样目的,效率也无损失。

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

来源:http://www.tulaoshi.com/n/20160219/1611519.html

延伸阅读
标签: Web开发
Author: Walkdan (walkdan(at)gmail.com)  ASP.NET 2.0 的Eval()简化了掉了ASP 1.1 Container.DataItem,比如:  %# (Container.DataItem as DataRowView)["ProductName"].ToString() %        简化为:(去掉了类型指定 ASP 1.1, Eval通过反射实现,本文不再阐述)  ...
标签: Web开发
使用JavaScript可以创建自己的对象。虽然JavaScript内部和浏览器本身的功能已十分强大,但JavaScript还是提供了创建一个新对象的方法。 使其不必像超文本标识语言那样,求于或其它多媒体工具,就能完成许多复杂的工作。 在JavaScript中创建一个新的对象是十分简单的。首先它必须定义一个对象,而后再为该对象创建一个实例。这个实例就是...
标签: Web开发
从下面的木马中,发现的书写js的另一方法 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 代码如下: html body script type="text/jscript" function init() { document.write("Microsoft   OLE   DB   Provider   for   ODBC...
标签: Web开发
虽然 JavaScript 与Java有紧密的联系,但却是两个公司开发的不同的两个产品。Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言,它的前身是Live Script;而Ja...
标签: Web开发
上次写的一篇《JavaScript 数组的 uniq 方法》,发现代码的问题还是存在。比如如果数组内有 undefined 元素就无法过滤等。 昨天看见 Lazy 兄弟重新更新了函数,现在他是这样子写的: Array.prototype.uniq = function() {     var resultArr = [], ...

经验教程

188

收藏

88
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部