这道题是这样的。
var a = 6; setTimeout(function () { alert(a); a = 666; }, 1000); a = 66;
结果输出 66,说是因为作用域的问题。
66
但是为什么
var a = 6; (function(){ (function () { alert(a); a = 666; })(); })(); a = 66;
输出的就是 6 呢,我就不懂了。不也是作用域不一样吗?
6
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
哥们,除了作用域你还得看执行顺序呀?例1一秒后执行你的匿名函数,所以是先赋值了6,然后赋值66,1秒后alert,最后赋值666;例2是你们函数定义后就调用了,是先赋值6,再立即执行了函数,执行alert然后赋值666,最后赋值66.
重点在(function() {...})(),这个通常的作用是产生一个新的命名域,定义的变量就不会跟外面的变量冲突了,但可以使用外部的变量,是定义函数后立即执行。
(function() {...})()
补充下,我还以为题主的疑问在 (function(){})(),而其实是在 setTimeout 上,Sorry!
贡献点参考资料:
http://pandacafe.net/blog/337
解释了为什么setTimeout 0会在当前流程后执行的原因
http://www.pjhome.net/article/Javascript/setImmediate_requestAnimationFrame.html
一篇谈论setTimeout未来的文章,其中提到了我此前也不了解的16ms特点。
作用域一样,调用的时机不一样。你主要从alert执行的时机考察这个问题就能想清楚了。
首先执行
var a = 6;
然后设置一个定时,定时的内容是输出 a 的值,然后把 a 赋值为 666。注意1,此时,是输出 a 的值,到底是多少呢?只有执行到这儿才知道。 但是有一点儿是确定的,肯定不是 666。(why?)注意2,这里的函数并不会立即执行,js 引擎会继续执行下面的代码。
a
666
setTimeout(function () { alert(a); a = 666; }, 1000);
然后又给 a 赋值了一次,变成了 66。
a = 66;
因此,当时间到来的时候,输出了 a 的值:66。
先给你简化一下:
var a = 6; (function () { alert(a); a = 666; })(); a = 66;
第一步
a 的值是 6。(没有什么好解释的)。
第二步
(function () { alert(a); a = 666; })();
这里定义了一个函数,而且,这个函数立即执行了(注意后面的括号,是调用函数的意思)。 所以输出了 6。
后面的代码都无所谓了。
相关阅读:命名函数表达式探秘
哥们,除了作用域你还得看执行顺序呀?例1一秒后执行你的匿名函数,所以是先赋值了6,然后赋值66,1秒后alert,最后赋值666;例2是你们函数定义后就调用了,是先赋值6,再立即执行了函数,执行alert然后赋值666,最后赋值66.
重点在
(function() {...})()
,这个通常的作用是产生一个新的命名域,定义的变量就不会跟外面的变量冲突了,但可以使用外部的变量,是定义函数后立即执行。补充下,我还以为题主的疑问在 (function(){})(),而其实是在 setTimeout 上,Sorry!
贡献点参考资料:
http://pandacafe.net/blog/337
解释了为什么setTimeout 0会在当前流程后执行的原因
http://www.pjhome.net/article/Javascript/setImmediate_requestAnimationFrame.html
一篇谈论setTimeout未来的文章,其中提到了我此前也不了解的16ms特点。
作用域一样,调用的时机不一样。你主要从alert执行的时机考察这个问题就能想清楚了。
第一个
首先执行
然后设置一个定时,定时的内容是输出
a
的值,然后把a
赋值为666
。注意1,此时,是输出 a 的值,到底是多少呢?只有执行到这儿才知道。 但是有一点儿是确定的,肯定不是
666
。(why?)注意2,这里的函数并不会立即执行,js 引擎会继续执行下面的代码。
然后又给
a
赋值了一次,变成了66
。因此,当时间到来的时候,输出了
a
的值:66
。第二个
先给你简化一下:
第一步
a
的值是6
。(没有什么好解释的)。第二步
这里定义了一个函数,而且,这个函数立即执行了(注意后面的括号,是调用函数的意思)。 所以输出了
6
。后面的代码都无所谓了。
相关阅读:命名函数表达式探秘