它们之间有区别吗?json
开发过程当中彷佛不多有人去加个额外的window,以为画蛇添足。好比Ajax过程当中回调函数解析JSON格式字符串浏览器
1 ... 2 function callback(str){ 3 var json = eval('(' + str + ')'); 4 } 5 ...
但因为各个引擎实现差别,它们的区别仍是有的。一般直接使用eval,而非var json = window.eval('(' + str + ')');
又好比调试时使用alert,不多有人使用window.alert;IE中获取事件对象使用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,说明调用fn后eval修改的是fn内的局部变量x,而非全局的x。即eval执行的闭包环境是在fn内。函数
IE6/7/8 : 仍然输出5,即没有修改全局变量x,修改的仍然是局部变量x。
IE9/Firefox/Safari/Chrome/Opera : 输出10,修改的是全局变量x。
能够得出结论了
IE6/7/8中,eval和window.eval同样,写在自定义函数内是局部闭包,不然是全局闭包。
IE9/Firefox/Safari/Chrome/Opera中,eval同以上IE6/7/8,window.eval即便写在自定义函数内使用的也是全局闭包。测试