JS中script標(biāo)簽defer和async屬性的區(qū)別詳解
向html頁面中插入javascript代碼的主要方法就是通過script標(biāo)簽。其中包括兩種形式,第一種直接在script標(biāo)簽之間插入js代碼,第二種即是通過src屬性引入外部js文件。由于解釋器在解析執(zhí)行js代碼期間會阻塞頁面其余部分的渲染,對于存在大量js代碼的頁面來說會導(dǎo)致瀏覽器出現(xiàn)長時(shí)間的空白和延遲,為了避免這個問題,建議把全部的js引用放在</body>標(biāo)簽之前。
script標(biāo)簽存在兩個屬性,defer和async,因此script標(biāo)簽的使用分為三種情況:
1.<script src="example.js"></script>
沒有defer或async屬性,瀏覽器會立即加載并執(zhí)行相應(yīng)的腳本。也就是說在渲染script標(biāo)簽之后的文檔之前,不等待后續(xù)加載的文檔元素,讀到就開始加載和執(zhí)行,此舉會阻塞后續(xù)文檔的加載;
2.<script async src="example.js"></script>
有了async屬性,表示后續(xù)文檔的加載和渲染與js腳本的加載和執(zhí)行是并行進(jìn)行的,即異步執(zhí)行;
3.<script defer src="example.js"></script>
有了defer屬性,加載后續(xù)文檔的過程和js腳本的加載(此時(shí)僅加載不執(zhí)行)是并行進(jìn)行的(異步),js腳本的執(zhí)行需要等到文檔所有元素解析完成之后,DOMContentLoaded事件觸發(fā)執(zhí)行之前。
下圖可以直觀的看出三者之間的區(qū)別:
其中藍(lán)色代表js腳本網(wǎng)絡(luò)加載時(shí)間,紅色代表js腳本執(zhí)行時(shí)間,綠色代表html解析。
從圖中我們可以明確一下幾點(diǎn):
1.defer和async在網(wǎng)絡(luò)加載過程是一致的,都是異步執(zhí)行的;
2.兩者的區(qū)別在于腳本加載完成之后何時(shí)執(zhí)行,可以看出defer更符合大多數(shù)場景對應(yīng)用腳本加載和執(zhí)行的要求;
3.如果存在多個有defer屬性的腳本,那么它們是按照加載順序執(zhí)行腳本的;而對于async,它的加載和執(zhí)行是緊緊挨著的,無論聲明順序如何,只要加載完成就立刻執(zhí)行,它對于應(yīng)用腳本用處不大,因?yàn)樗耆豢紤]依賴。
小結(jié):
defer 和 async 的共同點(diǎn)是都是可以并行加載JS文件,不會阻塞頁面的加載,不同點(diǎn)是 defer的加載完成之后,JS會等待整個頁面全部加載完成了再執(zhí)行,而async是加載完成之后,會馬上執(zhí)行JS,所以假如對JS的執(zhí)行有嚴(yán)格順序的話,那么建議用 defer加載。
以上所述是小編給大家介紹的JS中script標(biāo)簽defer和async屬性的區(qū)別詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
iframe實(shí)現(xiàn)高度自適應(yīng)小程序web-view方案
這篇文章主要為大家介紹了iframe實(shí)現(xiàn)高度自適應(yīng)小程序web-view方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Javascript實(shí)現(xiàn)視頻文件播放功能(示例詳解)
這篇文章主要介紹了Javascript實(shí)現(xiàn)視頻文件播放功能,使用CSS完成相應(yīng)的布局樣式,利用JavaScript函數(shù)來監(jiān)聽進(jìn)度條,然后使用鼠標(biāo)點(diǎn)擊按鈕實(shí)現(xiàn)對視頻的播放,需要的朋友可以參考下2023-10-10JS組件Bootstrap Table使用實(shí)例分享
這篇文章主要為大家詳細(xì)介紹了JS組件Bootstrap Table分頁使用方法,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下2016-05-05H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決
這篇文章主要為大家介紹了H5如何實(shí)現(xiàn)喚起APP及調(diào)試bug解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05元素的內(nèi)聯(lián)事件處理函數(shù)的特殊作用域在各瀏覽器中存在差異
在一個元素的屬性中綁定事件,實(shí)際上就創(chuàng)建了一個內(nèi)聯(lián)事件處理函數(shù)(如<h1 onclick="alert(this);"...>...</h1>),內(nèi)聯(lián)事件處理函數(shù)有其特殊的作用域鏈,并且各瀏覽器的實(shí)現(xiàn)細(xì)節(jié)也有差異。2011-01-01使一個函數(shù)作為另外一個函數(shù)的參數(shù)來運(yùn)行的javascript代碼
使一個函數(shù)作為另外一個函數(shù)的參數(shù)來運(yùn)行的javascript代碼...2007-08-08JS實(shí)現(xiàn)將Asp.Net的DateTime Json類型轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間的方法
這篇文章主要介紹了JS實(shí)現(xiàn)將Asp.Net的DateTime Json類型轉(zhuǎn)換為標(biāo)準(zhǔn)時(shí)間的方法,涉及javascript針對時(shí)間與日期操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08JavaScrip數(shù)組去重操作實(shí)例小結(jié)
這篇文章主要介紹了JavaScrip數(shù)組去重操作,結(jié)合實(shí)例形式總結(jié)分析了javascript針對數(shù)組的遍歷、判斷、去重等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06