这是我现在正在使用的代码:
期望(
似乎情况是第二个
setTimeout(() => console.log('first'), 2000);
for (let i = 0; i < 5000; i++) {
console.log("printing...")
}
setTimeout(() => console.log('second'), 1000);
期望(setTimeout
立即开始倒计时)
- 第一个
setTimeout
将执行并启动2000毫秒的计时器。然而,由于setTimeout
回调是异步运行的,我们必须跳过它并等待整个调用堆栈完成后再处理回调队列。 - 遍历
for
循环。从我的计算机上看,整个for
循环大约需要20秒才能完成运行。在for
循环的几秒钟后,第一个setTimeout
应该已经完成了计时器。 - 然后执行第二个
setTimeout
并启动计时器。与第一步类似。 - 现在调用堆栈已经运行完毕,我们遍历回调队列。由于第一个
setTimeout
应该先完成延迟,尽管延迟更长,它应该先打印"first"
然后是"second"
。
实际情况
printing...
/* Lots of "printing..." strings */
printing...
second
first
似乎情况是第二个
setTimeout
仍然先运行。这种情况下,这是否意味着 setTimeout
的倒计时只在初始几行代码运行后开始?我在 Firefox 和 Chrome 上测试了这段代码,它们似乎有相同的行为。
setTimeout
执行后立即开始。请注意,迭代一个长度为5000的循环只需要几毫秒的时间。 - undefinedfor (let i = 0; i < 5000; i++) { console.log("printing...") }
需要20秒的原因。可能是打印的过程需要时间,但这并不意味着循环需要20秒。 - undefinedsetTimeout
,它们之间的代码运行时间足够长,第一个setTimeout
(假设它的延迟时间比第二个长)在第二个之前打印出来是可能的吗? - undefinedDate()
作为第二个参数添加到你的console.log
调用中来验证 - 这将在代码执行时运行,无论之后打印多久。 - undefined