前端學習筆記(4) - JavaScript宏觀與微觀任務

宏觀和微觀任務

在 ES3 和更早的版本中,JavaScript 本身還沒有異步執行代碼的能力,這也就意味着,宿主環境傳遞給 JavaScript 引擎一段代碼,引擎就把代碼直接順次執行了,這個任務也就是宿主發起的任務。

但是,在 ES5 之後,JavaScript 引入了 Promise,這樣,不需要瀏覽器的安排,JavaScript 引擎本身也可以發起任務了。

由於我們這裏主要講 JavaScript 語言,那麼採納 JSC 引擎的術語,我們把宿主發起的任務稱爲宏觀任務,把 JavaScript 引擎發起的任務稱爲微觀任務。

宏觀任務的隊列就相當於事件循環。在宏觀任務中,JavaScript 的 Promise 還會產生異步代碼,JavaScript 必須保證這些異步代碼在一個宏觀任務中完成,因此,每個宏觀任務中又包含了一個微觀任務隊列。

有了宏觀任務和微觀任務機制,我們就可以實現 JavaScript 引擎級和宿主級的任務了,例如:Promise 永遠在隊列尾部添加微觀任務。setTimeout 等宿主 API,則會添加宏觀任務。

如何分析異步執行的順序

  1. 首先我們分析有多少個宏任務;
  2. 在每個宏任務中,分析有多少個微任務;
  3. 根據調用次序,確定宏任務中的微任務執行次序;
  4. 根據宏任務的觸發規則和調用次序,確定宏任務的執行次序;
  5. 確定整個順序。
setTimeout(()=>{console.log('c')},0)
let x = new Promise((resolve,reject)=>{
    console.log('a')
    resolve()
}).then(res=>{
    console.log('b')
    setTimeout(()=>{console.log('d')},0)
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章