宏任务在事件循环中按FIFO顺序执行,需等待执行栈清空及微任务队列清空后才被取出;常见来源包括setTimeout、setInterval、setImmediate(Node.js)、I/O回调、UI渲染和MessageChannel的onmessage回调。
JavaScript 的宏任务(Macrotask)在产生后,会根据事件循环机制被排入对应的宏任务队列,等待当前执行栈清空、微任务队列执行完毕后,由事件循环依次取出执行。
以下操作会创建新的宏任务,并将其加入宏任务队列:
port.onmessage 回调(注意:虽然它常被用来模拟微任务,但实际是宏任务)宏任务不是“立刻执行”,而是在满足条件时被调度器插入宏任务队列:
宏任务与微任务(如 Promise.then、queueMicrotask)共存于事件循环,但优先级不同:
立即学习“Java免费学习笔记(深入)”;
可通过嵌套 setTimeout 和 Promise 来观察执行顺序:
console.log('1');setTimeout(() => console.log('2'), 0);Promise.resolve().then(() => console.log('3'));console.log('4');// 输出:1 → 4 → 3 → 2
说明:同步代码(1、4)先执行;接着执行微任务(3);最后轮到宏任务队列里的 setTimeout 回调(2)。