宏任務和微任務

什么是宏任務和微任務

宏任務(MacroTask),微任務(MicroTask)

1.兩者都是異步

2.同步和異步的區(qū)別:

(1)同步代碼執(zhí)行:你寫的順序是什么,他就按什么順序執(zhí)行,顯而易見,同步任務是阻塞的,也就是說,只有前一句執(zhí)行完成之后,才能進行下一句

(2)異步代碼的執(zhí)行:常見的異步就是callback,不是按照寫的順序執(zhí)行的就是異步,但是異步并不等于非阻塞,callback被調用的時機也是通過執(zhí)行到它才會被執(zhí)行,也是一步步往下執(zhí)行的,只不過不是按照寫的程序從上到下的順序而已,所以如果有些任務占用了整個線程,那么異步任務也會被阻塞,這也是由于JS都是單進程單線程的

(3)經典的JS都是單進程單線程的,單現(xiàn)代的JS已經突破了這一點,我們有方法新建額外地進程共同處理任務,NodeJS也可以在同一個進程中新建線程,瀏覽器也有要支持線程的計劃

(4)異步除了回調,還有其他種類的,比如任務,任務是一種隊列類型的,先注冊的任務先被執(zhí)行,任務里面,根據(jù)執(zhí)行的時機分為宏任務和微任務,根據(jù)什么區(qū)分發(fā)執(zhí)行時機,需要去看設計部分

3.進程的切換肯定是宏任務,因為需要花費大量的資源

4.線程的切換是微任務,因為只需要在同一個進程中切換就可以了

5.更準確的說,很多微任務都是纖程的切換導致的,纖程是比線程更小的概念

6.為什么和定時器有關的任務是宏任務?

(1)因為計時是實時的,它一定不能被阻塞,所以定時器被設計在另一個進程中被管理,所以,定時器任務會有進程的切換,所以只能是宏任務

7.事件為什么是宏任務呢?

事件的觸發(fā)是依賴于瀏覽器的實現(xiàn),平臺有它自己的事件注冊和派發(fā)機制,比如nodeJS用的內核libuv,所以不管怎樣,事件的獨立注冊表和派發(fā)機制導致,他也不會和JS存在一個進程中,事件的管理中心一定是在另外一個進程中實現(xiàn)的,那么去派發(fā)事件,也就是宏任務

8.JS本身語法內的

(1)比如async/await,它本身是一個迭代器,迭代器利用了纖程,在不同的纖程之間切換,所以是微任務

(2)進程和纖(線)程最大的區(qū)別是:進程占用單獨的資源,即不會共享CPU和內存,而線程往下,都是共享CPU和內存的,只是在一個空間中在進行拆分,做切換

(3)如果是JS本身的命令是進程的話,就沒有辦法拿到外面上下文的數(shù)據(jù)了,因為不共享內存

(4)JS本身的部分一定是比線程小的

9.非JS本身的

非JS本身的,因為往往被設計成不被JS阻塞的,所以會單獨開啟一個進程作管理,這樣出來的都是宏任務

# 那么像Observer(如MutationObserver等),和一些渲染為什么都是微任務呢?

(1)雖然它們和JS的本身無關,但是它們的執(zhí)行時機和它們所在的進程是有關的

(2)比如MutationObserver,觀察的是DOM,它的作用即是對DOM的變化做出響應,所以,他會在管理DOM的進程中

(3)渲染也是一樣的,是在整個渲染流程中的某一步作的回調,并沒有切換出它的本身所在的空間

微任務在執(zhí)行時,它能獲取到任務外的上下文

宏任務在執(zhí)行時,他不能獲取到任務外的上下文

?為什么定時器任務是宏任務?

(1)可以把定時器和定時器任務是分離的,先把定時器想成一個時間管理中心

(2)然后在上面注冊一個個任務,這些任務本身和時間無關

(3)時間管理中心和時間有關的,當時間管理中心發(fā)現(xiàn)時間到了,要執(zhí)行任務,就從任務列表中找出注冊的任務,并通知JS執(zhí)行任務

(4)所以可以看到,時間管理中心(定時器的進程)和執(zhí)行的任務(JS運行時)是無關的,不共享上下文,所以是宏任務

(5)控制渲染的函數(shù)如requestAnimationFrame,這個函數(shù)本身是要求在下一幀重繪前做什么,它的本身被設計成是在渲染的流程中,然后它做的事情應該也是和渲染有關的,也就是這個任務和它所處的空間的上下文一致

?微任務和宏任務執(zhí)行的順序

(1)因為微任務不需要執(zhí)行上下文(這里指的是資源的切換),所以它可以在一次上下文切換間隔中把所有的微任務都做掉

(2)而宏任務因為需要切換上下文,所以他會慢點執(zhí)行

(3)所以會先執(zhí)行已注冊的微任務,然后是宏任務

(4)這樣,就相當于做了一次上下文的切換,如果在此期間,又有新的微任務或宏任務被注冊了,就不斷重復上面的這個流程

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容