微任务永远比宏任务先执行,且每次只处理一个宏任务但清空全部微任务;同步代码最先执行,整个标签为首个宏任务,其同步部分执行完立即执行所有微任务(含过程中新增的),再取下一个宏任务。

微任务永远比宏任务先执行,而且每次只处理一个宏任务,但会清空全部微任务。
同步代码最先跑完
所有直接写的语句(比如 console.log、变量赋值、函数调用)都属于同步任务,它们按顺序立刻执行,直到调用栈清空。整个 <script></script> 标签本身就被视为第一个宏任务,它的同步部分会最先执行。
微任务紧接同步之后执行
同步代码一结束,JS 引擎马上检查微任务队列,并把里面所有任务依次执行完,中间不插队、不暂停:
-
Promise.then/catch/finally的回调 -
async/await中await后面的代码(等价于.then) -
queueMicrotask()显式添加的微任务 -
MutationObserver的回调(浏览器环境)
注意:在某个微任务中新建的微任务,会追加到当前微任务队列尾部,仍属于本轮执行,不会等到下一轮。
立即学习“Java免费学习笔记(深入)”;
宏任务排队等轮到自己
微任务队列清空后,事件循环才从宏任务队列里取一个执行。常见宏任务包括:
-
setTimeout/setInterval回调 - DOM 事件(如
click、input) - 网络请求回调(
fetch、XMLHttpRequest) - UI 渲染(浏览器中,通常在宏任务后触发)
-
requestAnimationFrame(虽常用于渲染前,但归类为宏任务)
执行顺序一句话概括
每轮事件循环只处理一个宏任务;该宏任务内的同步代码执行完 → 立即清空全部微任务(含过程中新加入的)→ 再取下一个宏任务。


















