为何JavaScript中setTimeout(...,0)执行顺序不符合预期?
为什么setTimeout(0)的回调会在最后执行?
这是个非常典型的JavaScript事件循环问题,我来给你把执行逻辑拆解明白:
首先你要记住一个核心点:JavaScript是单线程的,它的执行遵循事件循环机制,同步任务和异步任务的执行顺序有明确的优先级。
具体到你的代码执行流程:
我们一步步看这段代码的执行顺序:
console.log('First'); // NOTE: 0 milliseconds. setTimeout(function() {console.log('Inside setTimeout')}, 0); console.log('Last');
- 首先执行
console.log('First'):这是同步任务,直接进入主线程的调用栈执行,控制台输出First。 - 然后调用
setTimeout(...):这是一个宏任务(异步任务的一种)。哪怕你设置延迟为0毫秒,它的回调函数也不会立刻进入调用栈执行——浏览器会把这个回调函数放到宏任务队列里,等待主线程的所有同步任务执行完毕。 - 接着执行
console.log('Last'):同样是同步任务,立刻进入调用栈执行,控制台输出Last。 - 现在主线程的所有同步任务都执行完了,调用栈清空了,事件循环才会去检查宏任务队列,发现里面有setTimeout的回调函数,就把它放到调用栈里执行,这时候控制台才会输出
Inside setTimeout。
额外补充:
可能你会好奇,设置延迟0为什么不是立刻执行?其实即使写了0,浏览器也会有一个最小延迟限制(多数浏览器是4ms),但这不是导致顺序颠倒的核心原因——核心是同步任务的执行优先级远高于宏任务,必须等同步任务全部完成,才会处理异步任务队列里的内容。
内容的提问来源于stack exchange,提问作者Shaibal S
相关产品推荐
相关产品推荐

