传递给 setTimeout 的回调何时放入消息队列?

when is the callback passed to setTimeout put on the message queue?

setTimeout(callback, 1000)

callback1000ms后放入消息队列还是立即放入消息队列?

如果1000ms后才放入消息队列,那么1000不是说回调会在1000后运行,而是说回调可能会至少在 1000 之后才 运行?

回调何时添加到队列中并不重要,因为 setTimeout 无论如何都不是真正的异步(也就是它仍然与代码的其余部分在同一线程上运行)。

这里有一个小例子,说明 setTimeout 如何只是一个建议的最小等待超时:

let time = new Date().getTime();
setTimeout(() => test(1), 1000);
setTimeout(() => test(2), 1000);
setTimeout(() => test(3), 1000);
setTimeout(() => test(4), 1000);

function test(id)
{
  console.log(`executed ${id} after `, new Date().getTime() - time);
  for(let i = 0; i < 1000000000; i++)
  {
    i * 9;
  }
}

Is callback put on the message queue after 1000ms or is it put to the message queue immediately?

1000 毫秒后 - 那是计时器 运行 结束的时间。如果立即放入消息队列,就没有之前的等待了 运行.

If it is put to the message queue after 1000ms, then does that mean that the 1000 does not mean that the callback will run in 1000, but instead it means that the callback may be run at a minimum only after 1000?

是的,如果此时事件循环仍在忙于其他任务(尤其是 long-running 阻塞代码),它将不得不等待那些完成。消息队列是一个队列,一个任务一个接一个地为它服务;没有两个回调是并行执行的。

(请注意 setTimeout is allowed to lag arbitrarily 无论如何)。