宏任務(wù)(macrotask )和微任務(wù)(microtask )
macrotask 和 microtask 表示異步任務(wù)的兩種分類断箫。
在掛起任務(wù)時淋纲,JS 引擎會將所有任務(wù)按照類別分到這兩個隊列中刽射,首先在 macrotask 的隊列(這個隊列也被叫做 task queue)中取出第一個任務(wù)屈芜,執(zhí)行完畢后取出 microtask 隊列中的所有任務(wù)順序執(zhí)行拍棕;之后再取 macrotask 任務(wù)揪荣,周而復(fù)始,直至兩個隊列的任務(wù)都取完瘦真。
宏任務(wù)
(macro)task刊头,可以理解是每次執(zhí)行棧執(zhí)行的代碼就是一個宏任務(wù)(包括每次從事件隊列中獲取一個事件回調(diào)并放到執(zhí)行棧中執(zhí)行)。
瀏覽器為了能夠使得JS內(nèi)部(macro)task與DOM任務(wù)能夠有序的執(zhí)行诸尽,會在一個(macro)task執(zhí)行結(jié)束后原杂,在下一個(macro)task 執(zhí)行開始前,對頁面進行重新渲染您机,流程如下:
(macro)task->渲染->(macro)task->...
宏任務(wù)包含:
- script(整體代碼)
- setTimeout
- setInterval
- I/O
- UI交互事件
- postMessage
- MessageChannel
- setImmediate(Node.js 環(huán)境)
微任務(wù)
microtask,可以理解是在當(dāng)前 task 執(zhí)行結(jié)束后立即執(zhí)行的任務(wù)穿肄。也就是說,在當(dāng)前task任務(wù)后际看,下一個task之前咸产,在渲染之前。
所以它的響應(yīng)速度相比setTimeout(setTimeout是task)會更快仲闽,因為無需等渲染脑溢。也就是說,在某一個macrotask執(zhí)行完后赖欣,就會將在它執(zhí)行期間產(chǎn)生的所有microtask都執(zhí)行完畢(在渲染前)焚志。
微任務(wù)包含:
- Promise.then
- Object.observe
- MutationObserver
- process.nextTick(Node.js 環(huán)境)