js的非同步載入你真的懂嗎

2022-04-14 12:56:11 字數 1620 閱讀 2525

面試高頻之js的非同步載入

講這個問題之前, 我們從另乙個面試高頻問題來切入,

我們的web頁面從開始解析到頁面渲染完成都經歷了什麼 ?

1  ,  建立document物件, 開始解析頁面,    此時document.readystate = 'loading'

2 ,     遇到link標籤引入的css檔案, 建立執行緒並非同步載入css,繼續解析文件

3,

遇到script標籤引入的外部指令碼 ,  如果script標籤的屬性設定了defer或者async  則  建立執行緒非同步載入js , 否則同步載入js(阻塞了dom的解析)  , 繼續解析文件 (async指令碼載入完就執行)

4 ,   遇到img等要載入資源的標籤, 正常解析dom 標籤  ,  非同步載入src ,    繼續解析文件

5 ,    文件解析完畢 ,document.readystate = 'interactive' , 所有defer指令碼按順序執行,並且document會觸發 domcontentloaded事件 , 標誌著程式從同步指令碼執行階段轉化成事件驅動階段

6 , 當所有async 指令碼 載入並執行 完畢 , img 載入完畢  ,document.readystate = 'complete' ,  window 觸發  load  事件  。

7      從此   以非同步響應的方式處理使用者輸入, 網路事件等 。。。。。。

ok , 光說沒用, 我們來看看真相是否只有乙個。。。

document.onreadystatechange = () =>;

document.addeventlistener('domcontentloaded', () =>);

window.onload = () =>;

注意一點, domcontentloaded 事件 只能用  addeventlistener 來繫結

結果是這樣:

按順序列印出來了 。。。 

上文我們提到只有設定了defer /async 的 script 指令碼 才能非同步載入  , 

注意defer 有些低版本瀏覽器不相容,

async是w3c的標準,但只能在引入外部js檔案時使用,

當然,我們最常用的是把script標籤放在body 後面 ,這樣就不會阻塞dom解析

還有一種情況, 動態新增的script指令碼也是非同步載入的, 基於此 我們來封裝乙個 非同步載入script指令碼的函式

function loadscript (url, callback) }} 

else

}script.src =url;

//插入head中

}

以上就是 js 非同步載入 的 全部內容了, 歡迎小夥伴們補充

梯度下降你真的懂嗎

已知 x,y x,f x 對應的資料 1,1 2,1.8 3,3.2 4,3.8 5,5.25 找到這些點擬合出的函式?假設 的函式最簡單的形式為h x x h x theta x h x x目標 開始 可以看出,上面的例子中 theta 的初始值以及學習率 alpha 是關鍵。其實,theta 的...

String的split方法,你真的懂嗎

string的split方法相信大家都不陌生,或多或少都用過它將字串轉成乙個陣列,但是就是這樣乙個簡單的方法,裡面也有乙個不得不注意 不深不淺的小坑。本地測試 如下圖所示 圖1大家會發現split1跟split3的長度符合我們的預期,但是split2應該是長度為5,但實際長度卻仍然為4。相信大家在遇...

陣列名和指標你真的懂嗎?

下面我節選一些在各種論壇和文章裡經常見到的關於陣列的文字 一維陣列是一級指標 二維陣列是二級指標 陣列名可以作為指標使用 陣列名就是.的常量指標 陣列名就是.的指標常量 這些文字看起來非常熟悉吧?類似的文字還有許多,或許你就是經常說這些話的人呢。不過非常遺憾,這些文字都是錯誤的,實際上陣列名永遠都不...