gpt4 book ai didi

javascript - 为什么 setTimeout 延迟 0 仍然在 for 循环中的所有其他同步代码之后运行?

转载 作者:行者123 更新时间:2023-12-01 02:19:16 25 4
gpt4 key购买 nike

我知道这个问题的不同版本已经被讨论过,而且我认为这是独一无二的。为什么延迟为 0 仍会导致以下行为。

for(var i = 0; i <3; i ++) {
console.log(i, 'started');
setTimeout(()=> {
console.log(i);
},0)
console.log(i, 'done');
}

console.log('loop over');

// 0 started
// 0 done
// 1 started
// 1 done
// 2 started
// 2 done
// loop over
// 3 3 3

这是我目前所知道的认为:

引用 MDN 关于 setTimeouts 在堆栈上的位置:

This is because even though setTimeout was called with a delay of zero, it's placed on a queue and scheduled to run at the next opportunity; not immediately. Currently-executing code must complete before functions on the queue are executed, thus the resulting execution order may not be as expected.

我是否正确地说,for 循环和任何同步代码都放在 setTimeout 之前的调用堆栈上,即使您将延迟设置为 0,setTimeout 也将始终仅在 for 之后运行-循环已完成?否则,为什么延迟 0 仍会导致上述行为?

谢谢!

编辑:

在朝着正确的方向开始之后,我发现了一些视频和一个不错的小工具,可以向您展示事件循环以及它与此示例代码的关系。这是 JS 运行时模拟器:loupe

最佳答案

JavaScript 在浏览器和服务器上都作为事件循环运行。运行时不断轮询事件。事件由用户操作(例如,单击 DOM 元素 x)、I/O(从 I/O 或 ajax 调用返回的数据)和计时器事件(在本例中)组成。 setTimeout(fn, 0) 只是简单地添加一个事件,该事件至少在经过 0 毫秒后由事件循环处理。它始终会在处理当前事件后执行。

关于javascript - 为什么 setTimeout 延迟 0 仍然在 for 循环中的所有其他同步代码之后运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49331947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com