好吧,让我们用 0ms 来分解整个 setTimeout 的事情。乍一看,你可能会想,“兄弟,0ms 意味着它会立即运行,对吗?”但 JavaScript 有它自己的氛围,0 毫秒并不像你想象的那么即时。让我们一起来解决这个问题。
这是我们正在剖析的代码:
const promise = new Promise((resolve, reject) => { console.log(1); setTimeout(() => { console.log("timerStart"); resolve("success"); console.log("timerEnd"); }, 0); console.log(2); }); promise.then((res) => { console.log(res); }) console.log(4);
输出呢?
1 2 4 timerStart success timerEnd
当你看到setTimeout(() => { ... }, 0) 的时候,感觉里面的代码会在0ms后立即运行。但不,JavaScript 就像是,“兄弟,我有自己的系统,等你了!”
JavaScript 不仅仅直接运行代码,它还有一个名为 事件循环 的很酷的系统来处理任务。像这样想一下:
主要任务(同步):
像 console.log() 这样的东西首先运行。这些都是直接的、面对面的任务。
微任务(Promise):
接下来是承诺,甚至在计时器之前。就像他们有一张 VIP 票一样。
任务队列(定时器,如 setTimeout):
计时器位于生产线的后面,仅在微任务完成后运行。即使你给它 0ms,它也会等待。
让我们一步步看看发生了什么:
已创建承诺:
Promise .then():
console.log(4):
微任务运行(VIP):
任务队列运行:
即使你说 0ms,setTimeout 也是总是延迟。不管怎样,JavaScript 都会将其推送到任务队列。在接触任务队列之前,系统首先清除所有同步任务和微任务(promise)。
所以,简单来说:
0 毫秒与时间无关,而是与等待轮到有关。
想象一下您正在排队等待过山车:
以下是我们代码中的事件顺序:
了解 0ms 的真正工作原理可以帮助您编写更好的异步代码。当你的朋友调试 JavaScript 中的随机延迟时,向他们解释这也是一个很酷的技巧。
所以下次你看到 setTimeout(() => { ... }, 0) 时,请记住——这与时间无关,而与时间有关。这是关于优先级!
以上是setTimeout(..., ) 在 JavaScript 中的真正含义是什么? (事件循环解释!)的详细内容。更多信息请关注PHP中文网其他相关文章!