教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

微任務(wù)和宏任務(wù)的區(qū)別是什么?

更新時(shí)間:2023年05月29日10時(shí)21分 來(lái)源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  微任務(wù)和宏任務(wù)是在異步編程中經(jīng)常使用的概念,用于管理任務(wù)的執(zhí)行順序和優(yōu)先級(jí)。

  微任務(wù)(Microtask)和宏任務(wù)(Macrotask)都是異步任務(wù),但它們之間存在一些關(guān)鍵的區(qū)別:

  1.微任務(wù):

  (1)微任務(wù)通常比宏任務(wù)具有更高的優(yōu)先級(jí)。

 ?。?)微任務(wù)總是在當(dāng)前任務(wù)執(zhí)行完成后立即執(zhí)行。

 ?。?)微任務(wù)通常是由JavaScript引擎本身創(chuàng)建和調(diào)度的,如Promise的回調(diào)函數(shù)、MutationObserver的回調(diào)等。

  2.宏任務(wù):

  (1)宏任務(wù)通常具有較低的優(yōu)先級(jí)。

  (2)宏任務(wù)會(huì)被推遲執(zhí)行,直到JavaScript引擎處于空閑狀態(tài)時(shí)才會(huì)執(zhí)行。

  (3)宏任務(wù)可以由各種事件觸發(fā),例如鼠標(biāo)事件、定時(shí)器事件(setTimeout、setInterval)等。

  下面是一個(gè)簡(jiǎn)單的JavaScript代碼演示,展示了微任務(wù)和宏任務(wù)的執(zhí)行順序:

console.log('1');

setTimeout(function() {
  console.log('2');
}, 0);

Promise.resolve().then(function() {
  console.log('3');
});

console.log('4');

  輸出結(jié)果為:

1
4
3
2

  在這個(gè)示例中,首先打印了數(shù)字1和4,這是因?yàn)樗鼈兪峭饺蝿?wù)。然后,微任務(wù)Promise的回調(diào)函數(shù)被添加到微任務(wù)隊(duì)列中。接下來(lái),通過(guò)setTimeout函數(shù)創(chuàng)建的定時(shí)器被添加到宏任務(wù)隊(duì)列中。當(dāng)JavaScript引擎處于空閑狀態(tài)時(shí),它會(huì)先執(zhí)行微任務(wù)隊(duì)列中的任務(wù),然后再執(zhí)行宏任務(wù)隊(duì)列中的任務(wù)。

  所以,數(shù)字3首先被打印,這是因?yàn)槲⑷蝿?wù)具有更高的優(yōu)先級(jí),它會(huì)在當(dāng)前任務(wù)完成后立即執(zhí)行。然后,數(shù)字2被打印,這是因?yàn)楹耆蝿?wù)需要等待一段時(shí)間,直到JavaScript引擎空閑時(shí)才會(huì)執(zhí)行。

  需要注意的是,微任務(wù)和宏任務(wù)的執(zhí)行順序可能會(huì)因?yàn)g覽器和JavaScript引擎的實(shí)現(xiàn)而有所不同。上述示例只是一種可能的執(zhí)行順序,不同的環(huán)境下可能會(huì)有差異。

0 分享到:
和我們?cè)诰€交談!