JS 主线程单线程,同一时刻仅执行一个任务。
执行规则:同步任务优先执行,所有同步执行完毕后,再处理异步任务。
一、同步任务
存放在 调用栈 (Call Stack),代码从上到下依次执行,栈空才会去读取任务队列。
二、微任务
同步代码执行完后,优先清空所有微任务,再执行宏任务。
常见微任务:
Promise.then/.catch/.finallyasync/await后续代码(await 之后)queueMicrotask()MutationObserver(浏览器端)
三、宏任务
微任务队列清空后,才执行宏任务。每执行完一个宏任务,就再次检查微任务。
常见宏任务:
setTimeout/setIntervalsetImmediate(Node)- DOM 事件、UI 渲染
AJAX请求
四、完整执行流程(浏览器事件循环)
- 执行全局同步代码,依次压入调用栈执行;
- 同步代码执行完毕,调用栈为空;
- 读取微任务队列 ,一次性执行所有微任务;
- 微任务全部清空后,取出第一个宏任务执行;
- 该宏任务执行完 → 回到步骤 3,再次检查微任务,循环往复(事件循环)。