當我們開啟**時,網頁的渲染過程就是一大堆同步任務,比如頁面骨架和頁面元素的渲染。而像載入**之類占用資源大耗時久的任務,就是非同步任務。,我們用導圖來說明:
那主線程執行棧何時為空呢?js引擎存在monitoring process
程序,會持續不斷的檢查主線程執行棧是否為空,一旦為空,就會去event queue
那裡檢查是否有等待被呼叫的函式。
以上就是js執行的整體流程
需要注意的是除了同步任務和非同步任務,任務還可以更加細分為macrotask(巨集任務)和microtask(微任務),js引擎會優先執行微任務
微任務包括了 promise 的**、node 中的 process.nexttick 、對 dom 變化監聽的 mutationobserver。
巨集任務包括了 script 指令碼的執行、settimeout ,setinterval ,setimmediate 一類的定時事件,還有如 i/o 操作、ui 渲 染等。
面試答案:
例子:
settimeout(function解析:第一輪:主線程開始執行,遇到settimeout,將settimeout的**函式丟到巨集任務佇列中,在往下執行new promise立即執行,輸出2,then的**函式丟到微任務佇列中,再繼續執行,遇到process.nexttick,同樣將**函式扔到為任務佇列,再繼續執行,輸出5,當所有同步任務執行完成後看有沒有可以執行的微任務,發現有then函式和nexttick兩個微任務,先執行哪個呢?process.nexttick指定的非同步任務總是發生在所有非同步任務之前,因此先執行process.nexttick輸出4然後執行then函式輸出3,第一輪執行結束。 第二輪:從巨集任務佇列開始,發現settimeout**,輸出1執行完畢,因此結果是25431() , 0);
new promise(function
(resolve, reject) ).then(
function
() );
process.nexttick(
function
() )
console.log(5)
小謝第22問 for迴圈中的非同步事件
如果在for迴圈中寫乙個函式,然後等待for迴圈中的函式結束後再進行下一步函式請求,再js中,我們顯然要進行同步處理,可以用async await進行處理,如下方 場景 因為要for 迴圈後才執行this.gettable這個函式,因此用await將api函式變為同步,等待for迴圈執行結束後再執行...
小謝第50問 vuex的五個屬性 使用 介紹
一 vuex 是什麼?官網 vuex 是乙個專為 vue.js 應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以相應的規則保證狀態以一種可 的方式發生變化。二 為什麼我們要用呢?官網 當我們的應用遇到多個元件共享狀態時,單向資料流的簡潔性很容易被破壞 對於問題一,傳參的方法...
演算法導論之選取第j小的元素
include include include define max 1000 int partition int a,int p,int r p int temp a i 1 a i 1 a r a r temp return i 1 int randomizedpartition int a,i...