javascript中的宏任务主要来自外部环境调度,典型类型包括定时器(settimeout、setinterval、setimmediate)、i/o操作(网络请求、文件读写、postmessage)、dom事件监听器和requestanimationframe,均在同步代码与微任务执行完毕后按队列顺序执行。

JavaScript 中的宏任务主要来自外部环境调度,定时器和 I/O 操作是最典型、最常接触的两类。
常见的定时器类宏任务
这些 API 的回调不会立即执行,而是被推入宏任务队列,等待当前同步代码和所有微任务执行完毕后才运行:
- setTimeout(callback, delay):即使 delay 设为 0,回调也属于宏任务;浏览器最小延迟通常为 4ms(受事件循环阻塞影响可能更长)
- setInterval(callback, interval):每次触发的回调都作为独立宏任务入队,不保证严格准时,尤其在主线程繁忙时会累积或跳过
- setImmediate(仅 Node.js):在当前事件循环阶段结束后、下一轮开始前执行,优先级高于 setTimeout(0),但低于微任务
常见的 I/O 类宏任务
I/O 操作本身是系统级异步行为,其完成后的回调函数被归为宏任务,因为它们依赖操作系统通知,无法由 JS 引擎直接控制时机:
- 网络请求回调:XMLHttpRequest 的 onload/onerror、fetch 的 then 回调(注意:fetch 返回 Promise,但其底层网络完成通知触发的是宏任务)
- 文件操作(Node.js):fs.readFile、fs.writeFile 等回调函数,属于 poll 阶段处理的 I/O 回调
- postMessage 和 MessageChannel 的消息事件:跨窗口或 Worker 通信中,接收到消息后触发的 event handler 是宏任务
容易被忽略但同样属于宏任务的 I/O 相关行为
部分操作虽不显式写回调,但背后仍走宏任务流程:
- DOM 事件监听器:如 click、scroll、input 等用户触发事件的处理函数,本质是浏览器 I/O(输入设备中断)驱动的宏任务
- requestAnimationFrame(浏览器):虽然用于动画优化,但规范中将其视为宏任务(部分实现接近渲染前哨,但仍排队于宏任务队列)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











