JavaScript單執行緒,微任務,巨集任務
阿新 • • 發佈:2020-12-09
技術標籤:javascript
文章目錄
一、JavaScript的單執行緒
從一誕生,JavaScript 就是單執行緒,這已經成了這門語言的核心特徵,將來也不會改變。
為了利用多核 CPU 的計算能力,HTML5 提出 Web Worker 標準,允許 JavaScript 指令碼建立多個執行緒,但是子執行緒完全受主執行緒控制,且不得操作 DOM。所以,這個新標準並沒有改變 JavaScript 單執行緒的本質。
二、微任務,巨集任務
因為js是單執行緒,所以在js執行的時候程式碼從上往下執行,先執行同步程式碼,在同步程式碼執行完畢之後,執行非同步程式碼, 任務執行
setTimeout(() => {
//執行後 回撥一個巨集事件
console.log('內層巨集事件3')
}, 0)
console.log('外層巨集事件1');
new Promise((resolve) => {
console.log('外層巨集事件2');
resolve()
}).then(() => {
console.log('微事件1');
}).then(()=>{
console.log('微事件2')
})
// 結果為
// 外層巨集事件1
// 外層巨集事件2
// 微事件1
// 微事件2
// 內層巨集事件3
執行順序
首先瀏覽器開始解析js程式碼從上之下,先執行同步,遇到非同步之後分發到供任務和微任務
在同步執行完畢後,先執行微任務,然後執行巨集任務
在執行微任務或者巨集任務中發生巢狀時,首先先執行其中的同步程式碼,然後在執行微任務,在微任務執行完畢後,先暫時不執行其中 的巨集任務,先執行與當前任務統計的微任務或者巨集任務,然後在全部執行完畢後,在折回去執行剛才巢狀的巨集任務。
setTimeout在執行的時候是所有延時器一起進行,哪個時間短執行哪個
微任務
巨集任務