首先看一下 eval 和 window.eval 的区别闭包
直接看示例代码:测试
var x = 2; var test = function(){ var x = 5; eval('alert(x)'); }; var test_win = function(){ var x = 6; window.eval('alert(x)'); }; alert(x); // IE6/7/8/9/Chrome/Ff: 2 test(); // IE6/7/8: 5, IE9/Chrome/Ff: 2 test_win(); // IE6/7/8: 6, IE9/Chrome/Ff: 2
这里首先定义了一个全局变量x,而后分别在 test 和 test_win 的局部闭包内定义了变量x。能够看到 eval 引用的局部变量的x,而 window.eval 引用的是全局变量x(在IE9,Chrome,FF下)。this
各位看官看到这里应该已经发现了,在IE6/7/8下还有兼容性的问题,就是说eval和window.eval在IE6/7/8下的做用是同样的。spa
那如何才能兼容IE6/7/8呢?这个时候 window.execScript就派上用场了,并且这个玩意也只有IE才支持。code
将上面的 window.eval 换成 window.execScript,IE下面测试结果也是返回 2,bingo!blog
总结:ip
eval 做用于局部做用域,window.eval 和 window.execScript 做用于全局做用域,也能够等价的这么看作用域
eval === eval.call(this, str);io
window.eval === eval.call(window, str);function