微任务队列优先级高于宏任务队列,每次宏任务执行完必须清空全部微任务才取下一个宏任务;常见微任务包括promise.then/catch/finally、queuemicrotask、mutationobserver;宏任务如settimeout、click等构成事件循环主干;node.js中process.nexttick优先级高于promise.then,但浏览器中promise.then是典型微任务。

微任务队列的优先级**高于**宏任务队列,这是事件循环中一条硬性规则:每次执行完一个宏任务后,必须清空整个微任务队列,才会去取下一个宏任务。
微任务总在宏任务之间“插队”
同步代码执行完毕(即调用栈清空)后,事件循环不会立刻找下一个宏任务,而是先检查微任务队列。只要队列里有任务,就一个个执行,直到它变空。这个过程不中断、不跳过、不延迟——哪怕新微任务是在前一个微任务里动态生成的,也会被立即加入并执行。
- 常见微任务:Promise.then/catch/finally、queueMicrotask、MutationObserver 回调
- 它们全部走同一条微任务队列,内部按入队顺序执行
- 没有“微任务里的优先级高低”,只有“是否属于微任务”这一判断标准
宏任务是事件循环的主节奏
宏任务构成事件循环的主干步骤,每个宏任务执行完,都强制触发一次“微任务清空”。也就是说,宏任务之间天然被微任务隔开。
- 常见宏任务:setTimeout、setInterval、I/O 回调、UI 事件(如 click)、requestAnimationFrame、script 标签加载执行
- 每次只取一个宏任务执行,执行完立刻转向微任务,而不是继续取第二个宏任务
- 即使 setTimeout 设置为 0ms,它的回调也得等当前宏任务 + 所有微任务走完才轮到
注意一个特殊例外:process.nextTick(仅 Node.js)
在 Node.js 环境中,process.nextTick 的优先级比 Promise.then 还高,它会在当前操作结束后、但**尚未离开当前事件循环阶段**时立即执行,甚至早于微任务队列的常规处理。不过浏览器环境没有 process.nextTick,所以前端开发中只需记住:Promise.then 就是微任务里最典型的代表,且稳居宏任务之上。
一句话总结执行节奏
同步代码 → 微任务队列全清空 → 渲染(可选)→ 下一个宏任务 → 微任务队列全清空 → ……如此循环。微任务不是“更快的宏任务”,而是“必须插在两个宏任务之间的强制环节”。











