zoukankan      html  css  js  c++  java
  • eval与window.eval的差别

    它们之间有区别吗?

    开发过程中似乎很少有人去加个额外的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即使写在自定义函数内使用的也是全局闭包。

    此外:IE中的window.execScript总是在全局闭包下执行,令人惊奇的是Chrome也支持该方法。呵,Chrome策略是标准,IE一个不能少。



     

  • 相关阅读:
    37 图的存储结构
    hdu 1272 使用set和并查集
    题目数据输入中间读入字符
    第六篇 模块基础
    第十二章 并发编程
    并发编程(四)
    第五篇 函数进阶
    第四篇 函数基础
    并发编程(三)
    并发编程(二)
  • 原文地址:https://www.cnblogs.com/snandy/p/1986055.html
Copyright © 2011-2022 走看看