宏任务和微任务
约 623 字大约 2 分钟
2025-06-10
1、宏任务
JavaScript 执行环境中由宿主环境(浏览器/Node.js)发起的异步任务,会被放入任务队列(Task Queue)等待主线程执行栈清空后执行。
- 用户交互:例如点击、滚动、输入等用户操作触发的事件。
- 定时器:
setTimeout
、setInterval
。 - 网络请求:例如 Ajax 请求完成时触发的事件。
- I/O 操作:包括读取文件、写入文件等涉及到 I/O 操作的任务。
- 页面解析、渲染:包括 DOM 解析、CSS 解析、页面布局和绘制等与页面渲染相关的任务。
- 动画:
requestAnimationFrame
用于执行动画效果的任务。
2、微任务
JavaScript 引擎自身发起的、优先级更高的异步任务,会在当前宏任务执行完毕后立即执行,且会在下一个宏任务开始前清空整个微任务队列。
- Promise 回调:Promise 对象的处理程序(
.then
、.catch
、.finally
)中的回调函数都是微任务。 MutationObserver
:用于监测 DOM 变化的任务。process.nextTick
(在Node.js
环境下):在当前执行栈结束后立即执行的任务。queueMicrotask()
:用于将一个微任务添加到微任务队列中。
3、区别
以下是宏任务(Macrotask)与微任务(Microtask)的对比表格,清晰展示二者的核心区别:
对比维度 | 宏任务 (Macrotask) | 微任务 (Microtask) |
---|---|---|
定义 | 由宿主环境(浏览器/Node.js)发起的异步任务 | 由 JavaScript 引擎发起的、更高优先级的异步任务 |
存储队列 | 任务队列(Task Queue) | 微任务队列(Job Queue) |
队列数量 | 可以有多个 | 只有一个 |
触发时机 | 当前调用栈清空后执行(下一次事件循环) | 当前宏任务执行完毕后立即执行(同一事件循环内) |
优先级 | 较低,需等待微任务队列清空后执行 | 较高,优先于下一个宏任务执行 |
执行顺序 | 每次事件循环执行一个宏任务 | 一次性执行全部微任务,直到队列清空 |
嵌套行为 | 新任务加入队列,等待下一轮事件循环 | 新微任务会立即执行,可能导致递归(如微任务中生成新微任务) |
对渲染的影响 | 宏任务执行后可能触发 UI 渲染(浏览器) | 微任务执行期间阻塞渲染,必须全部执行完毕 |
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于