位置:首页 > JavaScript > JavaScript微任务队列在事件循环中的执行机制

JavaScript微任务队列在事件循环中的执行机制

时间:2026-08-20  |  作者:夜鞌不睡  |  阅读:0

每一轮宏任务执行完,微任务队列都会立刻被一次性清空。而且,微任务的优先级本身就高于宏任务。

这里面常见的就包括Promise.then/catch/finally、queueMicrotask()、MutationObserver等。要注意的是,新的微任务如果在这个过程中被继续塞进来,会接到当前这一轮队列的末尾并继续往下执行;至于宏任务,只能老老实实等到下一轮。

Ja vaScript 中微任务队列怎么在事件循环中执行

微任务队列在事件循环中,会紧随当前同步任务执行完毕后立即清空,且优先级高于宏任务。

微任务的触发时机

每当一个宏任务运行结束,JS 引擎都会立刻检查微任务队列。

此时会一次性执行完所有当前存在的微任务,中间不会穿插其他任务。常见的宏任务包括 script 执行、setTimeout 回调、I/O 回调等。

  • 微任务包括:Promise.then/catch/finallyqueueMicrotask()MutationObserver 回调等
  • 注意:微任务是“排队—执行—再排队”,不是“边排边执行”
  • 比如连续调用两次 queueMicrotask(fn),这两个 fn 会在同一轮微任务中依次执行

微任务与宏任务的执行顺序

事件循环每轮按固定节奏推进:执行一个宏任务 → 清空微任务队列 → 渲染(可选)→ 下一个宏任务。

  • 即使宏任务里什么都没做,只要它结束,就立刻进入微任务阶段
  • 微任务内部再创建新的微任务,也会被推入当前微任务队列末尾,并在本轮继续执行,直到队列为空
  • 但微任务中产生的宏任务,如 setTimeout,要等到下一轮事件循环才执行

实际执行流程示例

以下代码能清晰体现微任务的即时性和高优先级:

console.log(1);
Promise.resolve().then(() => console.log(2));
setTimeout(() => console.log(3), 0);
console.log(4);

输出为:1 → 4 → 2 → 3

  • 1 和 4 是同步代码
  • 2 是微任务,在第一轮宏任务(script)结束后立即执行
  • 3 是宏任务,排在下一轮

常见误区提醒

微任务不是“随时插入”,也不是“比宏任务快一点点”。它有明确的执行窗口,也有严格的清空机制。

  • 不要以为 Promise.then 总是“立刻”执行——它必须等当前同步代码和正在运行的宏任务彻底结束
  • 微任务不会被渲染或用户交互打断,浏览器保证在微任务队列清空前不进行页面重绘
  • 过度嵌套微任务,如递归 queueMicrotask,可能导致页面卡顿,因为控制权长时间不交还给事件循环

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多