为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2018-09-03 16:09:54
(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 这是为什么??
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

(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》对闭包作用域的解惑。


查看完整回答
反对 回复 2018-10-08
  • 1 回答
  • 0 关注
  • 579 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信