请看下面两段js代码,我懵逼了

(function(fn){
     var able=123;
     function tmp(){
         fn()
     };
     return tmp();
 })(function(){alert(able)});

报错;但是:

(function(fn){ 
    var able=123;
    function tmp(){
        (function(){
            alert(able)
        })();
    };
    return tmp()
})();

弹出123 这是为什么??


慕雪6442864
浏览 580回答 1
1回答

慕标琳琳

(function(fn){  var able=123;  function tmp(){      fn()  };  return tmp();})( //这段代码相当于一个参数,当它直接调用,会默认为全局作用域,但是全局并没用定义,所以会报错 // Uncaught ReferenceError: able is not defined(作用域的错误) function(){alert(able)} );在全局作用域定义一个able = 33, 结果会弹出33。你可以试一下var able = 33; (function(fn){ var able=123; function tmp(){      fn()  }; return tmp(); })(//这段代码相当于一个参数,当它直接调用,会默认为全局作用域,但是全局并没用定义,所以会报错 // Uncaught ReferenceError: able is not defined(作用域的错误)function(){alert(able)} );//这个并没有传递参数,直接调用(function(fn){var able=123;function tmp(){     (function(){    //这里是闭包能访问外层作用域 即able = 123,所以可以弹出         alert(able)     })(); };return tmp() })();建议看看《你不在知道的js》对闭包作用域的解惑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript