关于js作用域的问题
这道题是这样的。
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
呢,我就不懂了。不也是作用域不一样吗?
jnmnh
11 years, 2 months ago
Answers
哥们,除了作用域你还得看执行顺序呀?例1一秒后执行你的匿名函数,所以是先赋值了6,然后赋值66,1秒后alert,最后赋值666;例2是你们函数定义后就调用了,是先赋值6,再立即执行了函数,执行alert然后赋值666,最后赋值66.
重点在
(function() {...})()
,这个通常的作用是产生一个新的命名域,定义的变量就不会跟外面的变量冲突了,但可以使用外部的变量,是定义函数后立即执行。
补充下,我还以为题主的疑问在 (function(){})(),而其实是在 setTimeout 上,Sorry!
贡献点参考资料:
解释了为什么setTimeout 0会在当前流程后执行的原因
http://www.pjhome.net/article/Javascript/setImmediate_requestAnimationFrame.html
一篇谈论setTimeout未来的文章,其中提到了我此前也不了解的 16ms 特点。
Gaziki
answered 11 years, 2 months ago