您的位置:首页 > Web前端 > JavaScript

js中执行脚本字符串方法:window.eval()/eval()

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



Js代码


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





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



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

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



Js代码


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一个不能少。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: