async
和defer
屬性的腳本,相信你們都據說過,可是他的真正執行細節是什麼樣子的?不多有文章認真研究它,可能不太有人注重細節,但其實真正有技術含量的工做和項目,對於性能要求極高,那麼細節就很重要了.須要不斷的實驗自我嘗試linux
,操做系統,算法等,預計要持續學習到今年年末。紅寶書第四版出來後,我也是花了不少時間去看。對於延遲腳本,本身也是作了一個實驗,寫下了這篇總結script
標籤,帶async
和defer
屬性等,經過document.createElement('script')
建立而且沒有指定script.async=false
的腳本默認爲異步延遲
腳本(必須爲非內聯腳本),以下所示:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> </body> <script src="./async1.js" async></script> <script src="./async2.js" async></script> <script src="./defer1.js" defer></script> <script src="./defer2.js" defer></script> <script src="./common1.js"></script> <script src="./common2.js"></script> <script src="./common3.js"></script> </html>
common
開頭爲非異步延遲腳本,其他的都指定了延遲腳本的模式,分爲async
和defer
兩種
經過document.createElement建立的標籤插入默認爲
async
模式
async
和2個defer
標籤,其它的都是普通標籤.其中async1.js
裏面有4000行代碼,其它都是一個console.log
而已async
執行時機和順序不肯定緣由在於:async
是告訴瀏覽器,能夠沒必要等到它下載解析完後再加載頁面,也不用等它執行完後再執行其餘腳本,俗稱異步執行腳本
async
和普通模式都是一樣並行下載,只有defer是最後才下載(http1.1有併發數量限制
,但是這裏並非併發限制,當我刪除common
的引用後,我發現defer
永遠都是最後下載的)async
和defer
兩種模式,區別在於:html
async
是告訴瀏覽器,它不會操做dom
,能夠沒必要等到它下載解析完後再加載頁面,也不用等它執行完後再執行其餘腳本,俗稱異步執行腳本
, 多個async
沒法保證他們的執行順序,例如async1
和async2
沒法按順序執行defer
是在解析到結束到</html>
標籤後纔會執行,俗稱推遲執行腳本
,多個defer
能夠按順序執行,例如defer1
和defer2
能夠按順序執行(實際上也不保證順序執行)script
標籤後,async
是直接下載script
標籤後,defer
是最後下載相同點:前端
async
或者defer
標籤實際上都不能保證順序執行script
標籤內容的解析和頁面渲染load
事件前執行,可是不保證是在DomContentLoad
事件前仍是後執行defer
不必定在async
後面執行,從個人實驗結果和書上對它們對解析來看在看/贊/關注
.前端巔峯
公衆號後回覆:加羣
,便可加羣獲取3800G
免費前端學習視頻資源