JavaScript執行順序
一, JS程式執行的兩個階段
第一階段(載入階段)
載入文件內容,並根據他們在文件裡出現的順序從上往下依次執行引入j的s程式碼(包括內聯與外部指令碼),當html解析器遇到<script>元素時,預設必須先執行指令碼,然後再恢復文件的解析和渲染,該階段通常只持續1-2s;
第二階段(事件驅動)
是事件驅動的非同步處理階段,根據使用者的操作來進行非同步響應,即事件處理函式。該階段的第一個事件是load事件,表示文件已經完全載入,可以操作,該階段在文件載入完成,只要瀏覽器顯示文件,就會一直持續下去,可能會長時間處於不活動的狀態;
二,同步,非同步,延遲指令碼
指令碼執行在預設情況下是同步和阻塞的
defer 和 async 屬性 會暗示瀏覽器連結進來的指令碼不會使用 document.write(),也不會生成文件內容,因此瀏覽器可以在下載指令碼時繼續解析和渲染文件。
同步(defer)
定義方式 <script defer src="deferr.js"></script>
執行流程 瀏覽器會延時指令碼的執行,直到文件的載入和解析完成,並可以操作後才開始執行指令碼,
該指令碼會按照他們在文件裡出現的順序執行。
經常用來定義函式和註冊後面使用的註冊事件處理程式
可以遍歷和操作文件樹, 可以看到自己的 js 元素 和她們之前的文件
瀏覽器支援 所有的 IE,其他待定
非同步(async )
定義方式 <script async src="deferr.js"></script>
執行流程 瀏覽器會盡快執行指令碼,不會在下載指令碼時阻塞文件的解析,
可能會無序執行
禁止使用 document.write() 方法
可以看到自己的 js 元素,和他之前的所有的文件元素,
可能或乾脆不可能訪問其他的文件內容
若兩個屬性同時存在,則async優先
若兩個屬性都不存在時,他會將這些 js 元素載入到文件中,然後同步執行這些指令碼,並且在指令碼下載和執行時解析器就會暫停,這樣指令碼就可以吧 document.write()來把文字插入到輸入流中,解析器回覆時這些文字就會成為文件的一部分,
三,客戶端JS時間線
readyState 屬性返回當前文件的狀態
1.最初 web 瀏覽器還未開始建立 document 物件,未開始解析web頁面 ,此時 document.readyState == “uninitialized“ ---還未開始載入;
2.當 web 瀏覽器開始建立 document 物件,並開始解析 web 頁面, 解析 html 元素和她們的文字內容後新增的 element 物件和 text 節點到檔案,解析 js 元素, 此時 document.readyState == “loading “ ---載入中;
3. 當文件解析完成時, 此時 document.readyState == “interactive “ ---已載入,文件與使用者可以開始互動;
4.文件解析完成後,可能會等待其他內容載入,比如圖片之類的,放所有這些內容都載入完成,所有的非同步指令碼完成載入和執行, 此時 document.readyState == “complete “ --載入完成;