在 JavaScript 中,任務(wù)可分為同步任務(wù)和異步任務(wù),而異步任務(wù)又可分為宏任務(wù)和微任務(wù):
宏任務(wù):
指主線程上排隊(duì)執(zhí)行的任務(wù),例如setTimeout、setInterval...

宏任務(wù).png
微任務(wù):
通常是需要在當(dāng)前任務(wù)執(zhí)行結(jié)束后立即執(zhí)行的任務(wù),例如Promise.then()、process.nextTick等

微任務(wù).png
- JavaScript 引擎首先會執(zhí)行宏任務(wù)
- 然后在每個宏任務(wù)執(zhí)行完畢后,會立即執(zhí)行微任務(wù)隊(duì)列中的所有微任務(wù)。
-
微任務(wù)隊(duì)列中的任務(wù)執(zhí)行完畢后,再去執(zhí)行下一個宏任務(wù),如此循環(huán)往復(fù),直到所有任務(wù)都執(zhí)行完畢。這種機(jī)制被稱為事件循環(huán)(Event Loop)
3.png
以下是一個示例代碼,用于演示宏任務(wù)和微任務(wù)的執(zhí)行順序:
console.log(1)
setTimeout(()=>{
console.log(2)
},0)
const p = new Promise((res,rej)=>{
console.log(3)
res(1000)
console.log(4)
})
p.then(data=>{
console.log(data)
})
console.log(5)
- 在上述代碼中,首先會輸出1 3 4 5,這是因?yàn)樗鼈兪峭饺蝿?wù)會按照順序立即執(zhí)行。
- 然后,setTimeout函數(shù)會被添加到異步宏任務(wù)隊(duì)列中,Promise.then會被添加到微任務(wù)隊(duì)列中。當(dāng)主線程空閑時,會先執(zhí)行異步微任務(wù)隊(duì)列中的任務(wù),即輸出1000。
-
最后,才會執(zhí)行宏任務(wù)隊(duì)列中的任務(wù),輸出2。
image.png

