Macrotasks 和 Microtasks
基本知識
- 棧:先進後出
函數a調用函數b,b調用函數c。執行函數a,a入棧,a調用b, b入棧, b調用c,c入棧,c執行,返回結果,彈出棧,依次類推,最後a出棧 === 》先進後出
-
指針:當函數執行完畢後數組
- 基本數據類型會從 stack 中彈出
- 對象、數組的值是存在於 heap(堆) 中的,stack 只彈出指針了他們對應的指針。而真正的值依然存在 heap 中,而後由垃圾回收器自動的清理回收。
- 異步任務是由瀏覽器執行的。當任務執行完以後,瀏覽器會將任務執行的結果和實現定義的回調函數放入主線程中。因此當主線程任務阻塞的時候,任務隊列仍是能夠正常進行的。
macro tasks 和 micro tasks 分類
沒有找到很官方的定義,這個與瀏覽器引擎相關,看瀏覽器引擎怎麼定義任務的分類,如下是比較廣泛的分類
- macro tasks: 定時器、http、IO操做(setTimeout, setInterval, setImmediate, I/O, UI rendering)
- micro tasks: process.nextTick, Promises, Object.observe(廢棄), MutationObserver
執行順序
在同一輪執行中,micro tasks優先級比macro tasks高
- 在執行同步任務過程當中,碰到了macro tasks或者micro tasks,將其放入相對應的棧中。
- 先將全部的同步任務執行完
- 查看micro tasks,裏面是否有任務,有的話,執行完全部的任務。
- micro tasks執行事後,查看macro tasks,查看裏面是否有任務,若是有,執行第一個放入的任務。
- micro tasks執行完一個後,重複步驟1,2,3,4。
歡迎關注本站公眾號,獲取更多信息