JavaScript時間線

js時間線

js執行是單線程,並非說整個瀏覽器都是單線程的,姑且就成爲單線程吧css

js單線程的緣由是爲了不多線程操做dom,引起的併發問題,dom屬於基礎數據,從多線程上講,對它的操做要加事物,而js的操做最初就是爲了操做dom,嗯,幸虧是單線程的,總之一句話,凡是可以修改dom的必定得同步web


客戶端js時間線

一、建立document對象,開始解析web頁面。建立HTMLHtmlElement對象,添加到document中。這個階段document.readyState = 'loading'。
二、遇到link外部css,建立線程加載,並繼續解析文檔。併發
三、遇到script外部js,而且沒有設置async、defer,瀏覽器建立線程加載,並阻塞,等待js加載完成並執行該腳本,而後繼續解析文檔。js擁有修改dom的能力-->domcument.write
四、遇到script外部js,而且設置有async、defter,瀏覽器建立線程加載,並繼續解析文檔。瀏覽器

async屬性的腳本,腳本加載完成後當即執行。 defter==丟置尾部。
document.createElement('script')的方式動態插入script元素來模擬async屬性,實現腳本異步加載和執行。網絡

五、遇到img等,瀏覽器建立線程加載,並繼續解析文檔。併發
六、當文檔解析完成,document.readyState = 'interactive'。
七、文檔解析完成後,全部設置有defer的腳本會按照順序執行。(注意與async的不一樣)
八、document對象觸發DOMContentLoaded事件,這也標誌着程序執行從同步腳本執行階段,轉化爲事件驅動階段。
九、當全部async的腳本加載完成並執行後、img等加載完成後,document.readyState = 'complete',window對象觸發load事件。
十、今後,以異步響應方式處理用戶輸入、網絡事件等。多線程

相關文章
相關標籤/搜索