首页 > 解决方案 > 是什么决定了 Javascript 中被读取的行的顺序?

问题描述

这个例子是在演示中给出的,期望 1、2、3 作为这些函数的运行顺序,但实际上它是 1、3、2。好奇为什么 setTimeout 函数会最后运行?

console.log(1)
setTimeout(() => console.log(2), 0)
console.log(3)

标签: javascriptruntime

解决方案


异步回调,就像传递给setTimeout()上面的回调一样,被放入队列中,以便在脚本的主要同步主体运行完成时调用。

所以顺序是:

console.log(1)
setTimeout() // but not the callback
// put callback in queue
console.log(2)

// take item from queue and run
() => console.log(2)

这样做的一个结果是传递给的时间是回调触发之前的setTimeout最短时间。如果主要同步任务花费的时间比这更长,回调将延迟触发。

您可以通过运行长时间运行的while循环来证明这一点。(但不要在实际代码中这样做)

let start = Date.now()
let now = start
let then = now + 3000;
   
// set timer for 100ms
setTimeout(() => console.log("timeout fired ater", Date.now() - start, "milliseconds"), 100)

// slow while loop takes 3000ms
while (now < then){
  now = Date.now()
}
console.log("loop done")


推荐阅读