溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中async與defer有什么區(qū)別

發(fā)布時間:2020-06-26 00:56:44 來源:億速云 閱讀:228 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)JavaScript中async與defer的區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

一 引言

代碼如下

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

可以看到在script標(biāo)簽中,存在async與defer兩個屬性,首先這兩個屬性并共存,說直白點,你一個都不加,或者加兩個屬性其一,腳本加載規(guī)則都會不同,這點我在之前確實沒仔細(xì)了解過,導(dǎo)致我在實際開發(fā)中遇到了這樣一個問題:

我在同一個頁面需要引用2個script腳本,大致如下:

<script src="https://www.google.com/recaptcha/api.js"></script>
<script src="demo.js"></script>

注意,兩個script腳本都沒有添加async與defer屬性,demo.js中包含了谷歌人機(jī)驗證的初始化程序,正常來說一定得先加載必要的資源,這樣我的驗證碼才能初始化成功,這就像使用jQuery得先引用jQuery.js是一個道理。

但事實上,因為外網(wǎng)的問題,api.js引用雖然在前面,但下載并不穩(wěn)定,有時候會出現(xiàn)下載反而比demo.js更晚的情況,這就導(dǎo)致demo.js中的初始化報錯,怎么辦呢?這就得async與defer出場了,我們先來了解它們的區(qū)別。

二 屬性async、defer與不加的區(qū)別

1 不加屬性

引用script腳本,最常見的就是直接引用,不加其它屬性,這種情況瀏覽器會立即下載并執(zhí)行指定的腳本,一氣呵成,腳本不執(zhí)行完畢,后面的DOM加載全部給我候著,如下圖:

JavaScript中async與defer有什么區(qū)別

2 屬性async

了解ajax的同學(xué)對于async這個詞一定不陌生,它表示異步,如果script腳本添加了此屬性,瀏覽器會異步下載后立刻同步執(zhí)行腳本。

說通俗點,腳本下載是異步行為,下載過程中并不影響DOM加載,但一旦腳本下載完畢就會立刻同步執(zhí)行腳本,此時DOM加載還是得給我等著。如下圖:

JavaScript中async與defer有什么區(qū)別

3 屬性defer

與async一樣屬于異步下載腳本,但不同的地方是,腳本下載完成后并不會立刻執(zhí)行,而是等到DOM解析完成才會執(zhí)行腳本,相比async的粗暴,defer明顯更加實用。加載順序如下圖:

JavaScript中async與defer有什么區(qū)別

現(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é)束。

關(guān)于JavaScript中async與defer的區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI