event-loop(事件輪詢)
代碼進入執行棧後會判斷當前代碼是同步任務仍是異步任務,若是是同步任務則會將任務調到主線程同步執行,若是是異步任務則會將任務調到異步隊列中。ajax
主線程同步任務執行完畢後,會檢測異步隊列中是否存在異步任務:異步
- 若存在異步任務則先檢測是否有定時器任務,若是有並時間到則執行定時器異步任務;
- 若不存在定時器任務或定時器時間未到則檢測是否存在io異步任務,如文件讀寫,ajax請求等。若存在則執行io異步任務;
- 若不存在io異步任務或已執行完畢io異步任務,則檢測是否存在setImmediate異步任務,若存在則執行該異步任務;
- 1,2,3條結束後從新判斷異步隊列中是否還存在未執行的異步任務,若存在,則從第一條開始檢測執行,若異步隊列未空,則結束。
宏任務 & 微任務
主線程中執行的同步任務又分宏任務與微任務。函數
宏任務包含:oop
- 主體script代碼
- setTimeout,setInterval函數
- Promise
微任務包含:線程
- Promise對象的then處理
- process.nextTick
當同步任務中既包含宏任務又包含微任務的時候,執行順序是先執行宏任務,再執行微任務。對象