本文將介紹我本身對JS Event Loop
和 宏任務、微任務
的理解。
二話不說先上圖:
promise
接下來將會針對此圖講解什麼是Event Loop 什麼事宏任務和微任務(其實聰明的大家經過圖大致也能瞭解的是吧~),再此以前先簡單介紹幾個概念。瀏覽器
JavaScript的單線程,與它的用途有關。做爲瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操做DOM。這決定了它只能是單線程,不然會帶來很複雜的同步問題。好比,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另外一個線程刪除了這個節點,這時瀏覽器應該以哪一個線程爲準?異步
因此,爲了不復雜性,從一誕生,JavaScript就是單線程,這已經成了這門語言的核心特徵,未來也不會改變。函數
爲了利用多核CPU的計算能力,HTML5提出 Web Worker 標準,容許JavaScript腳本建立多個線程,可是子線程徹底受主線程控制,且不得操做DOM。因此,這個新標準並無改變JavaScript單線程的本質。(此段來自阮老師)oop
任務隊列
(Task Queue)的任務。Event Table
執行,而後當執行結束會把回調函數推入到Event Queue
,而後等待主線程的結束。對於微任務的異步會推入到另一個Event Queue
,等待主線程的結束。Event Queue
)中的event拉到主線程執行。EventLoop
了。setTimeout(function() { console.log('setTimeout'); }, 0) new Promise(function(resolve) { console.log('promise 1'); resolve(); console.log('promise 2') }).then(function() { console.log('promise then'); }) console.log('1');
輸出結果:promise 1 、promise 2 、1 、promise then 、setTimeout
解釋:線程
eventloop中處理微任務和宏任務的邏輯也是不一樣廠商按照規範實現的 jsvm。code
宏任務 | 瀏覽器 | Node |
---|---|---|
setTimeout | √ | √ |
setInterval | √ | √ |
setImmediate | x | √ |
requestAnimationFrame | √ | x |
微任務 | 瀏覽器 | Node |
---|---|---|
process.nextTick | x | √ |
MutationObserver | √ | x |
Promise.then catch finally | √ | √ |
來自個人簡書的文章:Event Loop、 宏任務和微任務server