您好,匿名用户

关于js作用域的问题

0 投票

这道题是这样的。

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 呢,我就不懂了。不也是作用域不一样吗?

用户头像 提问 2016年 9月19日 @ 狐狸叫 下士 (861 威望)
分享到:

1个回答

0 投票
 
最佳答案

哥们,除了作用域你还得看执行顺序呀?例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特点。

用户头像 回复 2016年 9月19日 @ Shen 中士 (1,403 威望)
提一个问题:

相关问题

0 投票
1 回复 131 阅读
用户头像 提问 2017年 4月18日 @ Vladimir 中士 (1,295 威望)
0 投票
1 回复 93 阅读
用户头像 提问 2012年 12月1日 @ Graves 中士 (1,264 威望)
0 投票
1 回复 12 阅读
用户头像 提问 5月21日 @ Zeus 下士 (833 威望)
0 投票
1 回复 139 阅读
用户头像 提问 2012年 12月1日 @ Diana 中士 (1,236 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

IT技术交流群 - 随意问
欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...