JavaScript微任务队列在事件循环中的执行机制
时间:2026-08-20 | 作者:夜鞌不睡 | 阅读:0每一轮宏任务执行完,微任务队列都会立刻被一次性清空。而且,微任务的优先级本身就高于宏任务。
这里面常见的就包括Promise.then/catch/finally、queueMicrotask()、MutationObserver等。要注意的是,新的微任务如果在这个过程中被继续塞进来,会接到当前这一轮队列的末尾并继续往下执行;至于宏任务,只能老老实实等到下一轮。
微任务队列在事件循环中,会紧随当前同步任务执行完毕后立即清空,且优先级高于宏任务。
微任务的触发时机
每当一个宏任务运行结束,JS 引擎都会立刻检查微任务队列。
此时会一次性执行完所有当前存在的微任务,中间不会穿插其他任务。常见的宏任务包括 script 执行、setTimeout 回调、I/O 回调等。
- 微任务包括:
Promise.then/catch/finally、queueMicrotask()、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,可能导致页面卡顿,因为控制权长时间不交还给事件循环
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- JavaScript正则表达式批量处理HTML标签转义与替换方法
- 时间:2026-08-21
-
- JavaScript函数默认参数的精准JSDoc类型注解方法
- 时间:2026-08-21
-
- JavaScript设置Cookie的SameSite属性防范CSRF攻击
- 时间:2026-08-21
-
- JavaScript中BOM如何打开新的浏览器窗口标签
- 时间:2026-08-20
-
- JavaScript中网络超时如何用流程控制实现中断
- 时间:2026-08-20
-
- JavaScript防抖函数原理与减少高频事件触发方法
- 时间:2026-08-20
-
- TypeScript六个颠覆认知的核心知识点解析
- 时间:2026-08-20
-
- JavaScript原型对象constructor指向机制详解
- 时间:2026-08-20
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
