JavaScript通过事件循环实现异步,宏任务(如setTimeout)执行后清空所有微任务(如Promise.then),再进入下一宏任务,确保微任务优先于渲染执行。

JavaScript 是单线程语言,靠事件循环(Event Loop)实现异步操作的调度。理解宏任务(MacroTask)与微任务(MicroTask)是掌握 JavaScript 异步执行机制的关键。
JavaScript 引擎在执行代码时,会先运行同步代码,遇到异步任务则将其交给浏览器或 Node.js 环境处理,并注册回调函数。当异步操作完成,回调会被放入任务队列。事件循环不断检查调用栈是否为空,一旦空了,就从任务队列中取出下一个任务执行。
关键点在于:事件循环每次从宏任务队列中取一个任务执行,执行完后,立即清空当前所有的微任务队列,然后再回到宏任务队列取下一个任务。
宏任务是事件循环中一次完整的执行单元。每个宏任务执行完毕后,浏览器可以进行渲染更新。
立即学习“Java免费学习笔记(深入)”;
微任务在当前宏任务执行结束后立即执行,且会全部执行完才继续下一个宏任务。
来看一个经典例子:
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.log('4');
输出结果是:1 → 4 → 3 → 2
解释:
再看一个复杂一点的例子:
console.log('start');
setTimeout(() => {
console.log('timeout1');
Promise.resolve().then(() => {
console.log('promise in timeout');
});
}, 0);
Promise.resolve().then(() => {
console.log('promise1');
setTimeout(() => {
console.log('timeout in promise');
}, 0);
});
console.log('end');
输出顺序:start → end → promise1 → timeout1 → promise in timeout → timeout in promise
分析:
注意:微任务总是在当前宏任务末尾被集中执行,即使它是在 setTimeout 回调中创建的。
很多人误以为 setTimeout(..., 0) 就是“立刻执行”,其实它只是尽快加入宏任务队列,必须等当前所有同步和微任务完成。
微任务的高优先级意味着滥用 Promise.then 做大量计算可能阻塞渲染,因为浏览器只在宏任务之间重绘页面。
在实际开发中,若想让某些操作延迟到当前所有异步回调之后执行,可以用 queueMicrotask 或 Promise.resolve().then() 包裹。
基本上就这些。搞清楚宏任务和微任务的执行时机,就能准确预测异步代码的输出顺序。不复杂但容易忽略细节。
以上就是JavaScript事件循环_宏任务与微任务详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号