关于js作用域的问题

发布于 2022-08-26 18:23:14 字数 357 浏览 17 评论 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 呢,我就不懂了。不也是作用域不一样吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

温柔戏命师 2022-09-02 18:23:14

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

掐死时间 2022-09-02 18:23:14

作用域一样,调用的时机不一样。你主要从alert执行的时机考察这个问题就能想清楚了。

唯憾梦倾城 2022-09-02 18:23:14

第一个

首先执行

var a = 6;

然后设置一个定时,定时的内容是输出 a 的值,然后把 a 赋值为 666
注意1,此时,是输出 a 的值,到底是多少呢?只有执行到这儿才知道。
但是有一点儿是确定的,肯定不是 666。(why?)
注意2,这里的函数并不会立即执行,js 引擎会继续执行下面的代码。

setTimeout(function () {
    alert(a);
    a = 666;
}, 1000);

然后又给 a 赋值了一次,变成了 66

a = 66;

因此,当时间到来的时候,输出了 a 的值:66

第二个

先给你简化一下:

var a = 6;
(function () {
    alert(a);
    a = 666;
})();
a = 66; 

第一步

var a = 6;

a 的值是 6。(没有什么好解释的)。

第二步

(function () {
    alert(a);
    a = 666;
})();

这里定义了一个函数,而且,这个函数立即执行了(注意后面的括号,是调用函数的意思)。
所以输出了 6

后面的代码都无所谓了。

相关阅读:命名函数表达式探秘

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文