循环中的迭代是如何添加到事件队列中的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (87)

一段时间以来,我一直试图理解以下代码:

for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    });
}

我知道它为什么产生这个输出:

5
5
5
5
5

我知道默认情况下,setTimeout函数使用0作为其milliseconds值,但它只保证将该方法添加到事件队列的最短时间。

是否将迭代在setTimeout之前添加到事件队列?

[0] => [1] => [2] => [3] => [4] => [console.log]

谢谢

提问于
用户回答回答于

使用let,而不是var

for (let i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(i);
    });
}

使用let,每次执行循环时,变量都是作用域,并将值保存在自己的内存引用中。使用var时,值是作用域,但保存在共享内存引用中,因此获取循环的所有执行的最后一个值。

用户回答回答于

中的每一条消息事件队列 corresponds to a function. Functions added to queue by your setTimeout will be only triggered after your main function completes.

As example:

    for (var i = 0; i < 5; i++) {
        setTimeout(function() {
            console.log(i);
        });
    }
    console.log('test')

it will output:

test
5
5
5
5
5

扫码关注云+社区

领取腾讯云代金券