面試高頻之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 = () =>;注意一點, domcontentloaded 事件 只能用 addeventlistener 來繫結document.addeventlistener('domcontentloaded', () =>);
window.onload = () =>;
結果是這樣:
按順序列印出來了 。。。
上文我們提到只有設定了defer /async 的 script 指令碼 才能非同步載入 ,
注意defer 有些低版本瀏覽器不相容,
async是w3c的標準,但只能在引入外部js檔案時使用,
當然,我們最常用的是把script標籤放在body 後面 ,這樣就不會阻塞dom解析
還有一種情況, 動態新增的script指令碼也是非同步載入的, 基於此 我們來封裝乙個 非同步載入script指令碼的函式
function loadscript (url, callback) }}以上就是 js 非同步載入 的 全部內容了, 歡迎小夥伴們補充else
}script.src =url;
//插入head中
}
梯度下降你真的懂嗎
已知 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。相信大家在遇...
陣列名和指標你真的懂嗎?
下面我節選一些在各種論壇和文章裡經常見到的關於陣列的文字 一維陣列是一級指標 二維陣列是二級指標 陣列名可以作為指標使用 陣列名就是.的常量指標 陣列名就是.的指標常量 這些文字看起來非常熟悉吧?類似的文字還有許多,或許你就是經常說這些話的人呢。不過非常遺憾,這些文字都是錯誤的,實際上陣列名永遠都不...