JS script腳本中async和defer區(qū)別詳解
一 引言
代碼如下
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
可以看到在script標簽中,存在async與defer兩個屬性,首先這兩個屬性并共存,說直白點,你一個都不加,或者加兩個屬性其一,腳本加載規(guī)則都會不同,這點我在之前確實沒仔細了解過,導致我在實際開發(fā)中遇到了這樣一個問題:
我在同一個頁面需要引用2個script腳本,大致如下:
<script src="https://www.google.com/recaptcha/api.js"></script> <script src="demo.js"></script>
注意,兩個script腳本都沒有添加async與defer屬性,demo.js中包含了谷歌人機驗證的初始化程序,正常來說一定得先加載必要的資源,這樣我的驗證碼才能初始化成功,這就像使用jQuery得先引用jQuery.js是一個道理。
但事實上,因為外網(wǎng)的問題,api.js引用雖然在前面,但下載并不穩(wěn)定,有時候會出現(xiàn)下載反而比demo.js更晚的情況,這就導致demo.js中的初始化報錯,怎么辦呢?這就得async與defer出場了,我們先來了解它們的區(qū)別。
二 屬性async、defer與不加的區(qū)別
1 不加屬性
引用script腳本,最常見的就是直接引用,不加其它屬性,這種情況瀏覽器會立即下載并執(zhí)行指定的腳本,一氣呵成,腳本不執(zhí)行完畢,后面的DOM加載全部給我候著,如下圖:
2 屬性async
了解ajax的同學對于async這個詞一定不陌生,它表示異步,如果script腳本添加了此屬性,瀏覽器會異步下載后立刻同步執(zhí)行腳本。
說通俗點,腳本下載是異步行為,下載過程中并不影響DOM加載,但一旦腳本下載完畢就會立刻同步執(zhí)行腳本,此時DOM加載還是得給我等著。如下圖:
3 屬性defer
與async一樣屬于異步下載腳本,但不同的地方是,腳本下載完成后并不會立刻執(zhí)行,而是等到DOM解析完成才會執(zhí)行腳本,相比async的粗暴,defer明顯更加實用。加載順序如下圖:
現(xiàn)在我們知道了腳本屬性async、defer以及不加的區(qū)別,回到文章開始的問題,我希望api.js一定在demo.js之前加載完成,不管需要等多久,所以我們可以這樣修改:
<script src="https://www.google.com/recaptcha/api.js" async></script> <script src="demo.js" defer></script>
那么到這里本文正式結(jié)束。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Javascript 中的 class、構(gòu)造函數(shù)、工廠函數(shù)
這篇文章主要介紹了詳解Javascript 中的 class、構(gòu)造函數(shù)、工廠函數(shù),需要的朋友可以參考下2017-12-12javascript實現(xiàn)獲取圖片大小及圖片等比縮放的方法
這篇文章主要介紹了javascript實現(xiàn)獲取圖片大小及圖片等比縮放的方法,涉及javascript針對圖形圖像相關(guān)屬性獲取與修改相關(guān)操作技巧,需要的朋友可以參考下2016-11-11JavaScript實現(xiàn)簡單圖片翻轉(zhuǎn)的方法
這篇文章主要介紹了JavaScript實現(xiàn)簡單圖片翻轉(zhuǎn)的方法,涉及javascript操作圖片與數(shù)組的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04JavaScript 進度條實現(xiàn)代碼(Firefox等相似瀏覽器下不支持)
JavaScript實現(xiàn)的進度條,可惜在Firefox等相似瀏覽器下不支持(遠程)2009-07-07原生JS forEach()和map()遍歷的區(qū)別、兼容寫法及jQuery $.each、$.map遍歷操作
這篇文章主要介紹了原生JS forEach()和map()遍歷的區(qū)別、兼容寫法及jQuery $.each、$.map遍歷操作,結(jié)合實例形式分析了JS使用forEach()和map()以及jQuery使用$.each、$.map進行遍歷操作相關(guān)技巧與操作注意事項,需要的朋友可以參考下2019-02-02JavaScript實現(xiàn)異步任務循環(huán)順序執(zhí)行詳解
這篇文章主要為大家詳細介紹了JavaScript中實現(xiàn)異步任務循環(huán)順序執(zhí)行的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-03-03至2023年最好用的兼容多瀏覽器的原生js復制函數(shù)copyText
因為后臺需要增加一些復制一些內(nèi)容非表單中內(nèi)容,那么下面這個函數(shù)就非常的好用了,其實也是利用了表單的數(shù)據(jù)權(quán)限比較容易突破,下面是具體的實現(xiàn)函數(shù),大家可以拿走2023-05-05