JS中的微任務(wù)和宏任務(wù)是什么?
JS中的語言類型
在談微任務(wù)和宏任務(wù)之前,我們首先要了解一下JS它是一種單線程的語言,也就是說它同一時間只能干同一件事.JS作為瀏覽器的腳本語言,它的主要用途在于與用戶互動,以及操作DOM,多線程并不適合它(比如一個線程添加DOM節(jié)點,一個線程來刪除DOM節(jié)點,該以哪個為準?).
JS中的異步代碼
在單線程的模式中,前一個任務(wù)結(jié)束我們才能去執(zhí)行下一個任務(wù),如果前一個任務(wù)耗時很長,后一個任務(wù)就不得不一直等著.

舉個簡單的例子,即使不點這個節(jié)點 123也是肯定會被打印出來的.
事件循環(huán)的任務(wù):ajax請求,定時器,事件...
JS的代碼執(zhí)行流程是?1執(zhí)行同步 2事件循環(huán) 所以上述代碼會先執(zhí)行console.log?再執(zhí)行點擊事件,明白這件事之后我們舉一個例子.

一個for循環(huán)包裹著一個定時器,這個執(zhí)行過程是這樣的先判斷for循環(huán)的內(nèi)容從0到3都符合那么i會自增到3,此時計時器會依次進入事件循環(huán)的隊列中,然后根據(jù)定時器,哪個快執(zhí)行哪個.

最終輸出的結(jié)果應(yīng)該是

宏任務(wù)和微任務(wù)
微任務(wù):promise.then
宏任務(wù):setTimeout...
要執(zhí)行宏任務(wù)的前提是清空了所有的微任務(wù).
流程:同步-事件循環(huán)[宏任務(wù)和微任務(wù)=>{微任務(wù)-宏任務(wù)}]

注意這里的new Promise是同步的 promise.then才是異步的微任務(wù).所以根據(jù)執(zhí)行流程,輸出結(jié)果為

標簽: