这道题是这样的。
var a = 6;
setTimeout(function () {
alert(a);
a = 666;
}, 1000);
a = 66;
结果输出 66,说是因为作用域的问题。
但是为什么
var a = 6;
(function(){
(function () {
alert(a);
a = 666;
})();
})();
a = 66;
输出的就是 6 呢,我就不懂了。不也是作用域不一样吗?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
作用域一样,调用的时机不一样。你主要从alert执行的时机考察这个问题就能想清楚了。
第一个
首先执行
然后设置一个定时,定时的内容是输出
a的值,然后把a赋值为666。注意1,此时,是输出 a 的值,到底是多少呢?只有执行到这儿才知道。 但是有一点儿是确定的,肯定不是
666。(why?)注意2,这里的函数并不会立即执行,js 引擎会继续执行下面的代码。
然后又给
a赋值了一次,变成了66。因此,当时间到来的时候,输出了
a的值:66。第二个
先给你简化一下:
第一步
a的值是6。(没有什么好解释的)。第二步
这里定义了一个函数,而且,这个函数立即执行了(注意后面的括号,是调用函数的意思)。 所以输出了
6。后面的代码都无所谓了。
相关阅读:命名函数表达式探秘