【study】宏任務和微任務的區別是什麼

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

  • 1.二者都是異步
  • 2.同步和異步的區別:
  • (1)同步代碼執行:你寫的順序是什麼,他就按什麼順序執行,顯而易見,同步任務是阻塞的,也就是說,只有前一句執行完成以後,才能進行下一句
  • (2)異步代碼的執行:常見的異步就是callback,不是按照寫的順序執行的就是異步,可是異步並不等於非阻塞,callback被調用的時機也是經過執行到它纔會被執行,也是一步步往下執行的,只不過不是按照寫的程序從上到下的順序而已,因此若是有些任務佔用了整個線程,那麼異步任務也會被阻塞,這也是因爲JS都是單進程單線程的
  • (3)經典的JS都是單進程單線程的,單現代的JS已經突破了這一點,咱們有方法新建額外地進程共同處理任務,NodeJS也能夠在同一個進程中新建線程,瀏覽器也有要支持線程的計劃
  • (4)異步除了回調,還有其餘種類的,好比任務,任務是一種隊列類型的,先註冊的任務先被執行,任務裏面,根據執行的時機分爲宏任務和微任務,根據什麼區分發執行時機,須要去看設計部分
  • 3.進程的切換確定是宏任務,由於須要花費大量的資源
  • 4.線程的切換是微任務,由於只須要在同一個進程中切換就能夠了
  • 5.更準確的說,不少微任務都是纖程的切換致使的,纖程是比線程更小的概念
  • 6.爲何和定時器有關的任務是宏任務?
  • (1)由於計時是實時的,它必定不能被阻塞,因此定時器被設計在另外一個進程中被管理,因此,定時器任務會有進程的切換,因此只能是宏任務
  • 7.事件爲何是宏任務呢?
  • 事件的觸發是依賴於瀏覽器的實現,平臺有它本身的事件註冊和派發機制,好比nodeJS用的內核libuv,因此無論怎樣,事件的獨立註冊表和派發機制致使,他也不會和JS存在一個進程中,事件的管理中心必定是在另一個進程中實現的,那麼去派發事件,也就是宏任務
  • 8.JS自己語法內的
  • (1)好比async/await,它自己是一個迭代器,迭代器利用了纖程,在不一樣的纖程之間切換,因此是微任務
  • (2)進程和纖(線)程最大的區別是:進程佔用單獨的資源,即不會共享CPU和內存,而線程往下,都是共享CPU和內存的,只是在一個空間中在進行拆分,作切換
  • (3)若是是JS自己的命令是進程的話,就沒有辦法拿到外面上下文的數據了,由於不共享內存
  • (4)JS自己的部分必定是比線程小的
  • 9.非JS自己的
  • 非JS自己的,由於每每被設計成不被JS阻塞的,因此會單獨開啓一個進程做管理,這樣出來的都是宏任務
  • 10.那麼像Observer(如MutationObserver等),和一些渲染爲何都是微任務呢?
  • (1)雖然它們和JS的自己無關,可是它們的執行時機和它們所在的進程是有關的
  • (2)好比MutationObserver,觀察的是DOM,它的做用便是對DOM的變化作出響應,因此,他會在管理DOM的進程中
  • (3)渲染也是同樣的,是在整個渲染流程中的某一步做的回調,並無切換出它的自己所在的空間
  • 11.微任務在執行時,它能獲取到任務外的上下文
  • 12.宏任務在執行時,他不能獲取到任務外的上下文
  • 13.爲何定時器任務是宏任務?
  • (1)能夠把定時器和定時器任務是分離的,先把定時器想成一個時間管理中心
  • (2)而後在上面註冊一個個任務,這些任務自己和時間無關
  • (3)時間管理中心和時間有關的,當時間管理中心發現時間到了,要執行任務,就從任務列表中找出註冊的任務,並通知JS執行任務
  • (4)因此能夠看到,時間管理中心(定時器的進程)和執行的任務(JS運行時)是無關的,不共享上下文,因此是宏任務
  • (5)控制渲染的函數如requestAnimationFrame,這個函數自己是要求在下一幀重繪前作什麼,它的自己被設計成是在渲染的流程中,而後它作的事情應該也是和渲染有關的,也就是這個任務和它所處的空間的上下文一致
  • 14.微任務和宏任務執行的順序
  • (1)由於微任務不須要執行上下文(這裏指的是資源的切換),因此它能夠在一次上下文切換間隔中把全部的微任務都作掉
  • (2)而宏任務由於須要切換上下文,因此他會慢點執行
  • (3)因此會先執行已註冊的微任務,而後是宏任務
  • (4)這樣,就至關於作了一次上下文的切換,若是在此期間,又有新的微任務或宏任務被註冊了,就不斷重複上面的這個流程
相關文章
相關標籤/搜索