<script src="a.js"></script>
沒(méi)有defer或async屬性焰络,瀏覽器會(huì)立即加載并執(zhí)行相應(yīng)的腳本。不等待后續(xù)文檔元素的加載符喝,只要讀到就開(kāi)始加載和執(zhí)行闪彼,這樣做會(huì)阻塞后續(xù)文檔的加載。
<script async src="a.js"></script>
如果有async屬性协饲,文檔的加載和渲染與js腳本的加載和執(zhí)行是并行執(zhí)行的畏腕,就是異步執(zhí)行。
<script defer src="a.js"></script>
有了defer屬性茉稠,文檔的加載和渲染和js腳本的加載是并行執(zhí)行的(請(qǐng)注意描馅,js腳本只加載不執(zhí)行),js的執(zhí)行需要等到文檔所有元素解析完成之后而线,DOMContentLoaded事件觸發(fā)之前流昏。
藍(lán)色代表js腳本網(wǎng)絡(luò)加載時(shí)間,紅色代表js腳本執(zhí)行時(shí)間吞获,綠色代表html解析况凉。
從上圖中可以明確幾點(diǎn):
1、defer和async的網(wǎng)絡(luò)加載過(guò)程是一致的各拷,都是異步執(zhí)行刁绒。
2、區(qū)別在于加載完成之后什么時(shí)候執(zhí)行烤黍,可以看出defer是文檔所有元素解析完成之后才執(zhí)行的知市。
3、如果存在多個(gè)defer腳本速蕊,那么它們是按照順序執(zhí)行腳本的嫂丙,而async,無(wú)論聲明順序如何规哲,只要加載完成就立刻執(zhí)行