defer的用途是代表腳本在執行時不會影響頁面的構造。也就是說,腳本會延遲到整個頁面都解析完畢後再運行。所以,在<script>元素中設置defer屬性,至關於告訴瀏覽器當即下載,但延遲執行。瀏覽器
async屬性與defer屬性相似,都用於改變處理腳本的行爲。建議異步腳本不要在加載期間修改DOM。網絡
defer與async的區別是:前者要等到整個頁面正常渲染結束,纔會執行;後者一旦下載完,渲染引擎就會中斷渲染,執行這個腳本之後,再繼續渲染。一句話,defer是「渲染完再執行」,async是「下載完就執行」。另外,若是有多個defer腳本,會按照它們在頁面出現的順序加載,而多個async腳本是不能保證加載順序的。異步
1. <script src="script.js"></script>async
沒有 defer 或 async,瀏覽器會當即加載並執行指定的腳本,「當即」指的是在渲染該 script標籤之下的文檔元素以前,也就是說不等待後續載入的文檔元素,讀到就加載並執行。spa
2. <script async src="script.js"></script>blog
有 async,加載和渲染後續文檔元素的過程將和 script.js 的加載與執行並行進行(異步)。事件
3. <script defer src="myscript.js"></script>ip
有 defer,加載後續文檔元素的過程將和 script.js 的加載並行進行(異步),可是 script.js 的執行要在全部元素解析完成以後,DOMContentLoaded 事件觸發以前完成。文檔
藍色線表明網絡讀取,紅色線表明執行時間,這倆都是針對腳本的;綠色線表明 HTML 解析。渲染
此圖告訴咱們如下幾個要點: