美文网首页
取消行结束符时出现的立即执行函数的BUG

取消行结束符时出现的立即执行函数的BUG

作者: 像烟花一样绚烂 | 来源:发表于2019-06-27 09:45 被阅读0次

    今天群里有人问了一个很简单(看似)的问题,下面的这段代码alert的值是多少?

    var number = 10;
    var showNumber = function () {
      alert(number);
    }
     
    (function () {
      number = 20;
      showNumber();
    })()
    

    按照正常的逻辑,number是全局作用域的变量,又因为number = 20;是在alert(number);之前执行,所以alert出来的值应该是20


    但是,复制到console下执行,alert出来的值却是10,而且关闭alert对话框之后,控制台报错

    VM232:9 Uncaught TypeError: (intermediate value)(...) is not a function
        at <anonymous>:9:3
    

    没看懂这行log的意思,仔细想了好一会儿才明白,代码执行的顺序和预期的是不一样的,因为没有;行结束符,所以实际执行的时候是这样的:

    var number = 10;
    var showNumber = ((function () {
      alert(number);
    })(function () {
      number = 20;
      showNumber();
    }))()
    

    其中

    function () {
      number = 20;
      showNumber();
    }
    

    只是作为参数,本身并没有执行,所以number值为1,而因为

    ((function () {
      alert(number);
    })(function () {
      number = 20;
      showNumber();
    }))
    

    执行结果为undefined,不是方法,继续执行undefined()报错

    相关文章

      网友评论

          本文标题:取消行结束符时出现的立即执行函数的BUG

          本文链接:https://www.haomeiwen.com/subject/olhlcctx.html