0毫秒的setTimeout如何工作? [重复]

问题描述 投票:0回答:1

这是我的代码:

console.log("Start");
setTimeout(() => {
    console.log("Timer");
}, 0);
console.log("End");

我得到的输出是:

Start
End
Timer

为什么会出现这种情况?

我知道事件循环不会使函数从任务队列中出列,除非调用堆栈为空。 所以,这是我的推理:

  1. console.log("start") 被执行并弹出

  2. setTimeout函数被推送,运行环境设置一个0毫秒的定时器。

  3. setTimeout 中的匿名函数(我们称这个函数为“fun”)被排队到任务队列中。

  4. setTimeout函数弹出。 现在调用栈不是空的吗?

    为什么将 console.log("End") 推送到调用堆栈而不是从任务队列中推送“fun”?

javascript asynchronous settimeout
1个回答
0
投票

JS使用run to finish,这意味着当前正在执行的代码会一直执行到最后。这意味着

setTimeout
和最后一个
console.log
都会在微队列或宏队列中的任何其他任务之前执行。

setTimeout
实际上在第二个
console.log
之前被调用,但是
setTimeout
的回调并没有被执行,因为它被推入队列以供将来执行。

© www.soinside.com 2019 - 2024. All rights reserved.