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

    evalwindow.eval的差别

    它们之间有区别吗?

    开发过程中似乎很少有人去加个额外的window,觉得多此一举。比如Ajax过程中回调函数解析JSON格式字符串

    1 ...
    2 function callback(str){
    3     var json = eval('(' + str + ')');
    4 }
    5 ...

    但由于各个引擎实现差异,它们的区别还是有的。通常直接使用eval,而非var json = window.eval('(' + str + ')');
    又比如调试时使用alert,很少有人使用window.alertIE中获取事件对象使用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,说明调用fneval修改的是fn内的局部变量x,而非全局的x。即eval执行的闭包环境是在fn内。


    IE6/7/8 : 仍然输出5,即没有修改全局变量x,修改的仍然是局部变量x
    IE9/Firefox/Safari/Chrome/Opera : 输出10,修改的是全局变量x

    可以得出结论了
    IE6/7/8中,evalwindow.eval一样,写在自定义函数内是局部闭包,否则是全局闭包。
    IE9/Firefox/Safari/Chrome/Opera中,eval同以上IE6/7/8window.eval即使写在自定义函数内使用的也是全局闭包。

  • 相关阅读:
    磁盘挂载自动分区脚本
    docker的私有仓库的搭建
    centos6上安装docker
    docker的本地仓库换成阿里云的镜像仓库
    python中的coding的格式书写形式
    mysql5.6的二进制包安装
    mysql忘记root密码
    Verilog利用$fdisplay命令往文件中写入数据
    Quartus和ISE调用Synplify进行综合的问题
    TMS320C6455 SRIO 实现方案
  • 原文地址:https://www.cnblogs.com/indigojh/p/5521092.html
Copyright © 2011-2022 走看看