概念
默認情況下js的腳本執行是同步和阻塞的,但是 <script> 標簽有 defer 和 async 屬性, 這可以改變腳本的執行方式,這些都是布爾類型了,沒有值,只需要出現在 <script> 標簽里即可。
如:
還要注意一點,html5說這些屬性只在和src屬性聯合使用時才有效。
如果同時指定了兩個屬性,則會遵從async屬性而忽略defer屬性。
作用
defer 屬性標注的腳本是延遲腳本,使得瀏覽器延遲腳本的執行,也就是說,腳本會被異步下載但是不會被執行,直到文檔的載入和解析完成,並可以操作,腳本才會被執行。
async 屬性標注的腳本是異步腳本,即異步下載腳本時,不會阻塞文檔解析,但是一旦下載完成后,立即執行,阻塞文檔解析。
區別
延遲腳本會按他們在文檔里的出現順序執行
異步腳本在它們載入后執行,但是不能保證執行順序。
一張圖足以說明區別:
使用async的意義就在於使得下載腳本時,不會阻塞文檔的解析。因為async的腳本執行順序是沒有保證的,因此要確認腳本間沒有依賴關系。
現在呢基本上都是在文檔的最后寫腳本,那么這和 defer 的區別在哪里呢?
第一點當然是異步下載腳本了,第二點就是 使用async或defer任何一個都意味着在腳本里不能出現 document.write。
參考
http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/
http://css-tricks.com/async-attribute-scripts-bottom/
<<JavaScript 權威指南>>