js的宏任務(wù)與微任務(wù)

在 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容