在HTML被解析的時候,若是遇到 <script> 標籤,就會先暫停HTML解析,當即執行腳本(非外部js文件)。<script src="./1.js"> 引入的外部js文件狀況下會先下載再執行。
因此,若是在HTML解析期間被執行 js 腳本且計算量很大的狀況下(循環十萬次),那麼頁面就會形成卡頓和白屏現象。html
這也是爲何 <script> 腳本建議寫在 <body></body> 標籤內的最後面,就是爲了加快 HTML DOM 樹的構建。web
我非要把 <script> 標籤寫在頭部呢?那麼就能夠根據場景合理應用 async(異步)和 defer(延遲)加載技術了。異步
從一個沒有任何屬性的 <script> 標籤提及,HTML解析階段若是遇到 <script>標籤,就會中止後續的DOM樹建立,當即下載(引入的外部js文件)並執行,執行完畢再繼續解析HTML。async
async 爲異步加載,在HTML解析階段並行下載外部的 js 文件,下載完成後暫停 HTML 解析器執行 js 文件。執行完畢後繼續 HTML 的解析模塊化
defer 爲延遲腳本。在 HTML 解析階段並行下載外部的 js 文件,下載完成後並不會當即執行,而是在 HTML 解析完成後 DOMContentLoaded 事件觸發以前執行 js 文件。延遲加載也保證在文檔中出現的順序執行。3d
參考文檔:
https://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.htmlhtm