eval与window.eval的差别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了eval与window.eval的差别相关的知识,希望对你有一定的参考价值。

evalwindow.eval的差别

它们之间有区别吗?

开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如Ajax过程中回调函数解析JSON格式字符串

1 ...
2 function callback(str){
3     var json = eval(‘(‘ + str + ‘)‘);
4 }
5 ...

但由于各个引擎实现差异,它们的区别还是有的。通常直接使用eval,而非var json = window.eval(‘(‘ + str + ‘)‘);
又比如调试时使用alert,很少有人使用window.alertIE中获取事件对象使用event,很少有人使用window.event。(Firefox中在某些情况下也支持event而不支持window.event

 1 var x = 5;
 2 
 3 function fn(){
 4 
 5     var x = ‘jack‘;
 6 
 7     eval(‘x=10;‘);
 8 
 9 }
10 
11 fn();
12 
13 alert(x); // -->5

修改下,把以上代码的eval换成window.eval,测试后发现各个浏览器中的表现不一样了。所有浏览器中输出的都是5,说明调用fneval修改的是fn内的局部变量x,而非全局的x。即eval执行的闭包环境是在fn内。


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

可以得出结论了
IE6/7/8中,evalwindow.eval一样,写在自定义函数内是局部闭包,否则是全局闭包。
IE9/Firefox/Safari/Chrome/Opera中,eval同以上IE6/7/8window.eval即使写在自定义函数内使用的也是全局闭包。

 

以上是关于eval与window.eval的差别的主要内容,如果未能解决你的问题,请参考以下文章

浅谈AngularJS中的$parse和$eval

jQuery必知要点

获取浏览器创建的请求的响应标头

s中的eval方法详解–eval方法的初级应用

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Python eval 与 exec 函数区别