#### async與defer屬性
- \<script\>元素的屬性中,除了最常使用的src屬性和type屬性外,還可以設(shè)置async和defer屬性。在不使用這兩個(gè)屬性的情況下,所有\(zhòng)<script\>元素都會(huì)按照它們?cè)陧?yè)面中出現(xiàn)的**先后順序依次被解析**。
- 關(guān)于defer與async屬性的詳細(xì)解析可以參考這個(gè)回答:https://segmentfault.com/q/1010000000640869 。簡(jiǎn)而言之就是使用這兩個(gè)屬性的script download將與HTML parsing并行進(jìn)行(異步),相當(dāng)于變成了多線程,使得script download不阻塞HTML parsing。區(qū)別在于,使用async屬性的腳本在下載完后將立即執(zhí)行,而使用defer屬性的腳本則會(huì)等待頁(yè)面所有元素下載完之后,在DOMContentLoaded事件前執(zhí)行。此外,當(dāng)頁(yè)面有多個(gè)外部腳本,使用async屬性將不會(huì)按照它們?cè)贖TML中出現(xiàn)的順序被執(zhí)行,而是某個(gè)腳本下載完之后立即執(zhí)行;defer則會(huì)依次執(zhí)行,但不能保證所有瀏覽器都按照標(biāo)準(zhǔn)實(shí)現(xiàn)。
- 在目前個(gè)人接觸的開(kāi)發(fā)項(xiàng)目當(dāng)中,還沒(méi)有遇到需要使用這兩個(gè)屬性的場(chǎng)景。因?yàn)闊o(wú)論是通過(guò)將\<script\>元素放在頁(yè)面最后\</body\>標(biāo)簽之前,還是通過(guò)DOMContentLoaded事件回調(diào)執(zhí)行js代碼,都不阻塞頁(yè)面加載且無(wú)兼容問(wèn)題的顧慮。

#### 使用外部腳本的優(yōu)勢(shì)
- 可維護(hù)性
- 可緩存
#### 知識(shí)補(bǔ)充
- 按照慣例,外部JavaScript文件帶有.js擴(kuò)展名。但這個(gè)擴(kuò)展名不是必須的,因?yàn)闉g覽器不會(huì)檢查包含JS的文件的擴(kuò)展名。但是服務(wù)器通常還是需要看擴(kuò)展名決定為響應(yīng)應(yīng)用哪種MIME類(lèi)型,如果不使用.js擴(kuò)展名,請(qǐng)確保服務(wù)器能返回正確的MIME類(lèi)型。
- alert()只接受字符串參數(shù),因此傳入alert()的對(duì)象將會(huì)自動(dòng)調(diào)用toString()方法。
- 第一章 JavaScript簡(jiǎn)介
- 第二章 在HTML中使用JavaScript
- 第三章 基本概念
- 第四章 變量、作用域和內(nèi)存問(wèn)題
- 第五章 引用類(lèi)型
- 第六章 面向?qū)ο蟮某绦蛟O(shè)計(jì)
- 第七章 函數(shù)表達(dá)式
- 第八章 BOM
- 第九章 客戶(hù)端檢測(cè)
- 第十章 DOM
- 第十一章 DOM擴(kuò)展
- 第十二章 DOM2和DOM3
- 第十三章 事件
- 第十四章 表單腳本
- 第十六章 HTML5腳本程序
- 第十七章 錯(cuò)誤處理與調(diào)試
- 第二十章 JSON
- 第二十一章 AJAX和Comet
- 第二十二章 高級(jí)技巧
- 第二十三章 離線應(yīng)用與客戶(hù)端存儲(chǔ)
- 第二十四章 最佳實(shí)踐
- 第二十五章 新興的API
