小謝第46問 js事件機制

2022-03-07 02:54:47 字數 1135 閱讀 1976

當我們開啟**時,網頁的渲染過程就是一大堆同步任務,比如頁面骨架和頁面元素的渲染。而像載入**之類占用資源大耗時久的任務,就是非同步任務。,我們用導圖來說明:

那主線程執行棧何時為空呢?js引擎存在monitoring process程序,會持續不斷的檢查主線程執行棧是否為空,一旦為空,就會去event queue那裡檢查是否有等待被呼叫的函式。

以上就是js執行的整體流程

需要注意的是除了同步任務和非同步任務,任務還可以更加細分為macrotask(巨集任務)和microtask(微任務),js引擎會優先執行微任務

微任務包括了 promise 的**、node 中的 process.nexttick 、對 dom 變化監聽的 mutationobserver。

巨集任務包括了 script 指令碼的執行、settimeout ,setinterval ,setimmediate 一類的定時事件,還有如 i/o 操作、ui 渲 染等。

面試答案:

例子:

settimeout(function

() , 0);

new promise(function

(resolve, reject) ).then(

function

() );

process.nexttick(

function

() )

console.log(5)

解析:第一輪:主線程開始執行,遇到settimeout,將settimeout的**函式丟到巨集任務佇列中,在往下執行new promise立即執行,輸出2,then的**函式丟到微任務佇列中,再繼續執行,遇到process.nexttick,同樣將**函式扔到為任務佇列,再繼續執行,輸出5,當所有同步任務執行完成後看有沒有可以執行的微任務,發現有then函式和nexttick兩個微任務,先執行哪個呢?process.nexttick指定的非同步任務總是發生在所有非同步任務之前,因此先執行process.nexttick輸出4然後執行then函式輸出3,第一輪執行結束。 第二輪:從巨集任務佇列開始,發現settimeout**,輸出1執行完畢,因此結果是25431

小謝第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...