js是單線程的,通常狀況下,只有上一段代碼執行完畢後,纔會執行下面的代碼。
可是有時候須要向服務器請求數據,須要一段時間,爲了避免作到阻塞下面代碼的運行,就有了同步任務和異步任務的區分。
js代碼從上之下運行,同步任務和異步任務執行的環境不一樣,能夠分爲如下步驟:
- 同步任務會在主線程的執行棧內直接執行
- 當碰到請求事件比較長的異步代碼,或者其餘的異步函數,會將這些執任務,放到異步環境下進行執行註冊
- 當異步任務註冊完畢後,會將其回調函數放到任務隊列中(像ajax成功獲取會數據後執行的回調函數,計時器計時完畢執行的回調函數)
- 等待執行棧中的代碼執行完後,會依次執行任務隊列中註冊的函數
- 在執行任務隊列中的函數內,一樣會有同步任務和異步任務,依次重複着5步,就是所說的Event Loop 事件循環

在異步任務將回調函數放入任務隊列時,還會有兩種狀況,宏任務與微任務之分,宏任務會進入宏任務的任務隊列,微任務放到微任務隊列,執行任務隊列時,會先執行微任務隊列中的任務。
宏任務表明:ajax、setTimeout、setInterval
微任務表明:process.nextTick()、 new promise().then()的 .then()內的回調函數
- 只要微任務隊列中有任務,就先執行微任務隊裏的任務,
- 執行完後,依次執行宏任務隊裏中的任務
- 在執行一輪宏任務的時候,在該宏任務內可能會註冊一些新的微任務,放到的微任務對列
- 當該輪宏任務執行完,會檢測到微任務隊裏中的新任務,在依次執行微任務對列中的任務
- 當微任務隊裏中的執行完後,會繼續執行宏任務對列中的任務, 以此循環下去
