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