这是我的代码:
console.log("Start");
setTimeout(() => {
console.log("Timer");
}, 0);
console.log("End");
我得到的输出是:
Start
End
Timer
为什么会出现这种情况?
我知道事件循环不会使函数从任务队列中出列,除非调用堆栈为空。 所以,这是我的推理:
console.log("start") 被执行并弹出
setTimeout函数被推送,运行环境设置一个0毫秒的定时器。
setTimeout 中的匿名函数(我们称这个函数为“fun”)被排队到任务队列中。
setTimeout函数弹出。 现在调用栈不是空的吗?
为什么将 console.log("End") 推送到调用堆栈而不是从任务队列中推送“fun”?
JS使用run to finish,这意味着当前正在执行的代码会一直执行到最后。这意味着
setTimeout
和最后一个 console.log
都会在微队列或宏队列中的任何其他任务之前执行。
setTimeout
实际上在第二个console.log
之前被调用,但是setTimeout
的回调并没有被执行,因为它被推入队列以供将来执行。