1. 程式人生 > >JavaScript執行順序

JavaScript執行順序

一, JS程式執行的兩個階段

第一階段(載入階段)

載入文件內容,並根據他們在文件裡出現的順序從上往下依次執行引入j的s程式碼(包括內聯與外部指令碼),當html解析器遇到<script>元素時,預設必須先執行指令碼,然後再恢復文件的解析和渲染,該階段通常只持續1-2s;

第二階段(事件驅動)

是事件驅動的非同步處理階段,根據使用者的操作來進行非同步響應,即事件處理函式。該階段的第一個事件是load事件,表示文件已經完全載入,可以操作,該階段在文件載入完成,只要瀏覽器顯示文件,就會一直持續下去,可能會長時間處於不活動的狀態;

二,同步,非同步,延遲指令碼

指令碼執行在預設情況下是同步和阻塞的

,比如當html解析器在解析時遇見外部指令碼,此時,程式的執行流程會先阻塞html頁面的渲染,去執行js程式碼,此時,文件的文字內容雖然已經載入,但是未被瀏覽器引擎解析問dom樹,這意味指令碼後面的文件部分在下載和執行指令碼之前,在dom樹上是不存在的,瀏覽器裡你是看不到的。

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 “ --載入完成;