1. 程式人生 > 其它 >js中巨集任務和微任務

js中巨集任務和微任務

巨集任務包括:<script>整體程式碼、setTimeoutsetIntervalsetImmediateAjax、DOM事件
微任務process.nextTickMutationObserverPromise.then catch finally

JS是單執行緒,碰見同步執行同步 直到執行完畢,遇到非同步放到執行佇列中去,非同步(巨集任務和微任務),在非同步中微任務是優於巨集任務執行的

 1 setTimeout(_ => console.log(4))
 2 
 3 new Promise(resolve => {
 4   resolve()
 5
console.log(1) 6 }).then(_ => { 7 console.log(3) 8 }) 9 10 console.log(2)

整個這一串程式碼我們所在的層級我們看做一個任務,其中我們先執行同步程式碼。第一行的 setTimeout 是非同步程式碼,跳過,來到了 new Promise(…) 這一段程式碼。前面提到過,這種方式是一個建構函式,是一個同步程式碼,所以執行同步程式碼裡面的函式,即 console.log(1),接下來是一個 then 的非同步,跳過。最後一個是一段同步程式碼 console.log(2)。所以,這一輪中我們知道列印了1, 2兩個值。接下來進入下一步,即之前我們跳過的非同步的程式碼。從上往下,第一個是 setTimeout,還有一個是 Promise.then()。setTimeout 是巨集任務的非同步,Promise.then()是微任務的非同步,微任務是優先於巨集任務執行的,所以,此時會先跳過 setTimeout 任務,執行兩個 Promise.then() 的微任務。所以此時會執行 console.log(3) 函式。最後就只剩下 setTimeout 函式沒有執行,所以最後執行 console.log(4)。

綜上:最後的執行結果是 1, 2, 3, 4。

解釋下:

setTimeout就是作為巨集任務來存在的,而Promise.then則是具有代表性的微任務

參考:https://www.jb51.net/article/223869.htm