1. 因爲解釋器在解析執行js代碼期間會阻塞該javascript便籤後面的的渲染 舉個簡單的例子:javascript
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <script type="text/javascript"> var test=document.getElementById('test'); console.log(test) </script> </html> <body> <div id="test"> zhanhui</div> </body>
2.沒有defer或者async屬性,瀏覽器會當即加載並執行相應的js腳本,這樣就會影響後續的文檔內容的渲染加載html
3.有async屬性,後續頁面的一些操做(例如文檔的加載和渲染)是和js腳本加載執行是並行的,js高級編程設計中說道,當即下載該js腳本而且加載完成就執行,不考慮依賴,但不妨礙頁面的其餘操做,而且只對外部腳本有效java
4.有defer,當即下載該js可是會等到HTML文檔被徹底加載和解析完成以後執行,執行的順序也是按照加載的順序(當即下載,但延時執行)編程
另外還有幾個小知識點: 一、帶有src屬性的script元素不該該在其標籤之間在包含js代碼,若是有,則只會下載並執行外部js,嵌入的js則會被忽略瀏覽器
二、瀏覽器在遇到body標籤時纔開始呈現內容,因此咱們將script標籤放在body標籤內容的後面也就是</body>以前async