JS 有個很無語的阻塞特性,就是當瀏覽器在執行JS 代碼時,不能同時做其他任何事情,無論其代碼是內嵌的還是外部的。
答:下載是異步的沒問題,但是每個javascript執行的時候還是同步的,就是先出現的script標簽一定是先執行,即使是並行下載它最后一個下載完成。除非標有defer的script標簽,否則任何javascript在執行的時候都會中斷當前html文檔解析,自然會阻止頁面 渲染。
3、瀏覽器並行下載js和異步下載js有什么性能上的區別?
答:其實沒什么性能上的區別,只是異步下載javascript可以盡快的讓用戶看到頁面,比較安心罷了。
4、在《高性能javascript》中提到,使用JavaScript動態生成script節點,然后將其插入到文檔中動態加載js,js加載是異步的,加載和執行不會影響頁面渲染!特別不理解,不是說只要執行js就阻塞頁面渲染嗎?
答:javascript加載是不會影響已經渲染的頁面,但是會中斷html文檔解析,瀏覽器會在javascript執行以后決定當前文檔是否需要進行重新渲染或者文檔重排。所以即使javascript放到最后面也會使瀏覽器暫停,但不影響之前已經解析出來的dom文檔,此時對於用戶來說是可操作的,而在之前就加載javascript,瀏覽器會提早暫停,給用戶看到的就是白色的頁面,不友好。javascript有可能會修改dom,此時修改dom可能比較危險,因為正處於不穩定的狀態,如果使用document.write甚至會迫使瀏覽器強制解析新出現的動態內容,如果是這種情況,javascript執行完成以后就會進行重排。如果javascript修改了css,影響了layout的話,也會進行重渲染或重排。
5、做一般的項目有沒有必要使用LABjs,Require.js等加載庫?
答:項目大了重構起來很方便的,沒必要在初期就引入復雜性。