为何3个setTimeout宏任务会同时执行?
关于setTimeout宏任务与执行时机的疑问解答
首先明确:setTimeout确实属于宏任务。
你提到事件循环一个tick只执行一个宏任务,这点没错,但三个回调看起来几乎同时执行的原因在于:
- 当你连续调用这三个setTimeout时,它们的延迟计时是同时启动的,都是从当前代码执行到对应行的时间点开始算1000ms,不是等前一个回调执行完才开始计时。
- 1000ms后,这三个回调会被依次加入宏任务队列。
- 主线程空闲时,事件循环会逐个取出队列里的宏任务执行——因为这三个任务进入队列的时间差极小,执行它们的几个tick几乎是连续发生的,所以看起来像是在同一个周期内完成,但实际上每个回调都是在单独的tick里执行的。
你可以做个简单验证:如果把第三个setTimeout的延迟改成2000ms,就会看到前两个在1000ms后输出,第三个要再过1000ms才输出,这就能直观体现出它们的计时是独立的。
内容的提问来源于stack exchange,提问作者AlxCtchr
相关产品推荐
相关产品推荐

