宏任务是事件循环中每次只执行一个的完整执行单元,由宿主环境发起,执行后清空微任务队列再取下一个;常见类型包括整体script、setTimeout、UI事件、渲染、postMessage、Node.js I/O等。

宏任务是 JavaScript 事件循环中“一次完整执行单元”,每次事件循环只取一个宏任务来执行。它代表一个相对独立、粒度较大的异步操作入口,执行完后浏览器通常会进行 UI 渲染(如页面重绘),再进入下一轮循环。
宏任务的核心特点
它由宿主环境(浏览器或 Node.js)发起,不是 JS 引擎自身直接调度的;每个宏任务执行完毕后,JS 引擎会立即清空全部微任务队列,然后才取下一个宏任务;宏任务之间有明确边界,适合安排需与渲染同步或延时触发的操作。
常见的宏任务类型
以下都是标准或广泛支持的宏任务来源:
- 整体 script 代码:页面加载时 `
- setTimeout / setInterval:回调函数被推入宏任务队列,即使设为 0ms,也得等当前宏任务+所有微任务执行完才轮到
- UI 交互事件:比如 click、input、scroll、keydown 等事件回调
- UI 渲染(render):虽然不是 JS API,但浏览器在两个宏任务之间通常插入一次渲染,属于隐式宏任务阶段
- postMessage / MessageChannel:跨窗口或 iframe 通信的消息处理回调
- I/O 回调(Node.js):如 fs.readFile、net.connect 的回调
- setImmediate(仅 Node.js):在当前事件循环末尾、渲染前执行(注意:非标准,且已被 process.nextTick 和 Promise 替代趋势明显)
容易混淆的一点
宏任务不是“比微任务慢的任务”,而是调度层级不同:宏任务是事件循环的“主节奏”,微任务是它的“插队者”——每次宏任务刚结束,就强制插进来一批高优任务执行。所以 setTimeout 的回调一定晚于 Promise.then,哪怕时间设为 0。
立即学习“Java免费学习笔记(深入)”;
基本上就这些。










