解决方案 »

  1.   

    这种写法第一次见呢. 网上查了一下http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript(1, eval)('this') is considered as indirect eval call, which in ES5 does execute code globally. So the result will be the global the context.
    是说这种写法查找global作用域.但是用ie内核试了一下发现两个都是3. 估计不同内核的解释不一样, 所以...少用吧
      

  2.   

    这应该和作用域的概念还不太一样,应该算是一种定义的标准应该区分何为eval的直接调用和间接调用直接调用 形如 eval('1+1');间接调用 形如 
    (1, eval)('...')
    (eval, eval)('...')
    (1 ? eval : 0)('...')
    (__ = eval)('...')
    var e = eval; e('...')
    (function(e) { e('...') })(eval)
    (function(e) { return e })(eval)('...')
    (function() { arguments[0]('...') })(eval)
    this.eval('...')
    this['eval']('...')
    [eval][0]('...')
    eval.call(this, '...')
    eval('eval')('...')那么,根据ES5的标准,间接调用方式保证代码运行在全局作于域内,既然如此,自然输出1具体介绍,你可以查看 http://perfectionkills.com/global-eval-what-are-the-options/#evaling_in_global_scope
      

  3.   

    补充一句,定义针对的是ES5,只有实现了ES5标准的浏览器才会生效。
      

  4.   

    留个名,看到再看。
    Well, the Ecma spec considers a reference to eval to be a "direct eval call", but an expression that merely yields eval to be an indirect one -- and indirect eval calls are guaranteed to execute in global scope.
      

  5.   

    通过这个问题,我发现了一本新书《Effective JavaScript》,可惜在国外买中文版需要空运,那个大神能帮忙找找 pdf 的中文版额
      

  6.   

    《Effective JavaScript》中对eval有解释,在现代浏览器中间接调用eval会使用全局作为执行上下文,例如var myEval=eval;然后使用myEval,这样会失去eval的使用当前执行上下文的特性。
    var $ = 1;
     
    (function() {
     
      var $ = 2;
       
      (function() {
       
        var $ = 3;
     
        (eval)('console.log($)');   //这里显示 3 
     
        (0, eval)('console.log($)'); //这里显示 1,(0,eval)这么写为什么会查找顶级作用域的变量?    //因为这等价于:
        var temp = (0,eval);
        temp('console.log($)');    //temp使用了global作为执行上下文,而非当前的执行上下文
       
      })();
     
    })();
      

  7.   

    因为在国外,我叫书店老板发货之前帮我扫描了下,我做成了 pdf,传到了迅雷空间里,就20天期限,大家快去下载。《Effective JavaScript》中文版
    http://kuai.xunlei.com/d/hjQECcTLkL0iUwQA161版主、管理员一生平安!!!!谢谢!