You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript中setTimeout(...,0)执行顺序不符合预期?

为什么setTimeout(0)的回调会在最后执行?

这是个非常典型的JavaScript事件循环问题,我来给你把执行逻辑拆解明白:

首先你要记住一个核心点:JavaScript是单线程的,它的执行遵循事件循环机制,同步任务和异步任务的执行顺序有明确的优先级。

具体到你的代码执行流程:

我们一步步看这段代码的执行顺序:

console.log('First'); // NOTE: 0 milliseconds.
setTimeout(function() {console.log('Inside setTimeout')}, 0);
console.log('Last');
  1. 首先执行console.log('First'):这是同步任务,直接进入主线程的调用栈执行,控制台输出First。
  2. 然后调用setTimeout(...):这是一个宏任务(异步任务的一种)。哪怕你设置延迟为0毫秒,它的回调函数也不会立刻进入调用栈执行——浏览器会把这个回调函数放到宏任务队列里,等待主线程的所有同步任务执行完毕。
  3. 接着执行console.log('Last'):同样是同步任务,立刻进入调用栈执行,控制台输出Last。
  4. 现在主线程的所有同步任务都执行完了,调用栈清空了,事件循环才会去检查宏任务队列,发现里面有setTimeout的回调函数,就把它放到调用栈里执行,这时候控制台才会输出Inside setTimeout。

额外补充:

可能你会好奇,设置延迟0为什么不是立刻执行?其实即使写了0,浏览器也会有一个最小延迟限制(多数浏览器是4ms),但这不是导致顺序颠倒的核心原因——核心是同步任务的执行优先级远高于宏任务,必须等同步任务全部完成,才会处理异步任务队列里的内容。

内容的提问来源于stack exchange,提问作者Shaibal S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:57:12