【www.gdgbn.com--php函数】

开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如ajax过程中回调函数解析json格式字符串
复制代码 代码如下:
...

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

通常直接使用eval,而非var json = window.eval("(" + str + ")");
又比如调试时使用alert,很少有人使用window.alert;ie中获取事件对象使用event,很少有人使用window.event。(firefox中在某些情况下也支持event而不支持window.event。感兴趣的同学看看这篇 获取事件对象的全家)

但由于各个引擎实现差异,它们的区别还是有的。
复制代码 代码如下:

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。
ie9/firefox/safari/chrome/opera : 输出10,修改的是全局变量x。

可以得出结论了
ie6/7/8中,eval和window.eval一样,写在自定义函数内是局部闭包,否则是全局闭包。
ie9/firefox/safari/chrome/opera中,eval同以上ie6/7/8,window.eval即使写在自定义函数内使用的也是全局闭包。

本文来源:http://www.gdgbn.com/jiaocheng/29478/