论坛首页 Web前端技术论坛

eval与window.eval的差别

浏览 8698 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-21   最后修改:2010-09-15

它们之间有区别吗?开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如ajax过程中回调函数解析json格式字符串:

 

...
function callback(str){
	var json = eval('(' + str + ')');
}
...

 

 

通常直接使用eval,而非var json = window.eval('(' + str + ')');

 

另见:字符串转换成json的三种方式


又比如调试时使用alert,很少有人使用window.alert。但由于各个引擎实现差异,它们的区别还是有的。如下:

 

var x = 5;
function fn(){
	var x = 'jack';
	eval('x=10;');
}
fn();
alert(x); // -->5

 

所有浏览器中输出的都是5,说明调用fn后eval修改的是fn内的局部变量x,而非全局的x。即eval执行的闭包环境是在fn内。

修改下,把以上代码的eval换成window.eval,测试后发现各个浏览器中的表现不一样了。

IE6/7/8 : 仍然输出5,即没有修改全局变量x,修改的仍然是局部变量x


Firefox3.6.3/Safari4/Chrome6 dev/Opera10 : 输出10,修改的是全局变量x

测试IE9 Preview2,也是输出10,IE9开始向Firefox等靠拢了。

可以得出结论了,
IE6/7/8中,eval和window.eval一样,写在自定义函数内则是局部闭包,否则是全局闭包。


Firefox/Safari/Chrome/Opera/IE9中,eval同以上IE6/7/8,window.eval即使写在自定义函数内使用的也是全局闭包。

此外:IE中的window.execScript总是在全局闭包下执行,令人惊奇的是Chrome也支持该方法。呵,Chrome策略是标准,IE一个不能少。

 

 

   发表时间:2010-05-21  
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。
1 请登录后投票
   发表时间:2010-05-22  
fyland 写道
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。

不错
0 请登录后投票
   发表时间:2010-05-22  
强人啊,这都能发现..
0 请登录后投票
   发表时间:2010-05-23  
这个……学习了。。。
一直以为eval很好用,原来还有这等道理。。
拿来用了!
function jsonDecode(data){
    return (new Function("return " + data))();
}

哈哈~强大啊!
0 请登录后投票
   发表时间:2010-05-24  
function jsonDecode(data){
    return (new Function("return " + data))();
}
领教了.....
0 请登录后投票
   发表时间:2010-05-24  
fyland 写道
真还没注意这种差异。
不过现在都不建议用eval了,解析JSON,可以用这个
function jsonDecode(data){
    return (new Function("return " + data))();
}

其他要想实现类似的eval的功能,一般都是在DOM中创建一个script节点,然后script.text = data;

jQuery1.4中就是如此,其他好几种Javascript框架都是这么做的。



最好加个分号

return (new Function("return " + data + ";"))();


or:


return (new Function("return " + data + ";")).call(arguments.callee);
0 请登录后投票
   发表时间:2010-05-25  
chemzqm 写道
强人啊,这都能发现..

同感!
平时还真没注意加window.与不加之间到底有什么区别,许多教材上也是说只是书写上的省略,却不知各浏览器厂商都有自己的一套处理策略。哎!何时才能有一个标准产物啊。
0 请登录后投票
   发表时间:2010-05-25  
给自己找事做, 变量命名非得弄得有冲突吗?
0 请登录后投票
   发表时间:2010-05-26  
LZ很有研究精神啊
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics