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

今天群里有人问了一个很简单(看似)的问题,下面的这段代码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()报错