① 執行指令碼
出現在<script>和</script>標記對之間的JavaScript語句按照它們在指令碼中出現的順序來執行。當一個檔案有多個指令碼的時候,指令碼按照它們出現的順序來執行。指令碼可以出現在一個HTML文檔的<head>或<body>中。<head>中的指令碼通常定義了將要被其他代碼調用的函數。文檔的<head>中的指令碼定義一個函數,並且將這個函數作為稍後執行的一個onload事件控制代碼來註冊,這是很普通的。在一個文檔的<head>中調用document.write( )是合法的,但卻不常見。一個文檔的<body>中的指令碼可以做到<head>中指令碼所能夠做到的一切。可是在這些指令碼中調用document.write(
)更加常見。
② onload事件控制代碼
可以通過設定<body>標記的onload屬性來註冊一個onload控制代碼。當onload控制代碼被觸發的時候,文檔會完整地載入和解析,並且任何文件項目都可以被JavaScript代碼操作。因此修改文檔內容的JavaScript模組通常會包含一個執行修改的函數,以及當文檔完全載入的時候負責安排函數調用的事件註冊代碼。由於onload事件控制代碼在文檔完全解析之後調用,它們不能調用document.write( ).任何這樣的調用都重新開啟一個新的文檔並且覆蓋掉當前文檔,而不是在當前文檔後面新增內容;使用者甚至沒有機會看到當前文檔。
③ onunload事件控制代碼
當使用者導航離開一個web頁面,瀏覽器觸發onunload事件控制代碼,給該頁面上的JavaScript代碼最後一次運行機會。可以通過設定<body>標記的onunload屬性來定義一個onunload控制代碼。onunload控制代碼不應該運行任何耗費時間的操作,它也不應該彈出一個對話方塊。它的退出只是執行一個快速的清理操作,運行它不應該減慢或阻止使用者轉向一個新的頁面。
④ 作為執行環境的Window對象
文檔中所有的指令碼,事件控制代碼和JavaScript URL都共用同一個Window對象作為它們的全域對象。JavaScript變數和函數只不過是這個全域對象的屬性。
由於onload事件在所有指令碼都執行之前並不會調用,每個onload事件控制代碼都能夠訪問文檔中所有指令碼所定義的所有函數以及所聲明的所有變數。
不管何時,當一個新的對象載入到一個視窗中,該視窗的Window對象被恢複到其預設狀態:之前的文檔中的指令碼所定義的所有屬性和函數都被刪除,並且可能已經修改或覆蓋的任何標準系統屬性都被恢複。每個文檔都以一個清白的曆史開始。
⑤ 用戶端JavaScript執行緒模式
核心JavaScript語言並不包含任何線程機制,並且用戶端JavaScript也沒有增加任何線程機制。用戶端JavaScript是單線程的。當指令碼載入和執行的時候,文檔解析就停止下來,並且當事件控制代碼執行的時候,Web瀏覽器會停止對使用者輸入的響應。
單線程執行是為更加簡單的指令碼而制定的,可以編寫代碼同時確保兩個事件控制代碼不會同時運行。可以操作文檔內容,而且事Crowdsourced Security Testing道不會有其他的線程試圖同時修改文檔。
單線程執行也會給JavaScript程式員帶來負擔,這意味著JavaScript指令碼和事件控制代碼不能運行太長時間。如果一個指令碼執行計算密集的任務,它將會為文檔載入帶來一個延遲,而使用者無法在指令碼完成前看到文檔內容。如果一個事件控制代碼執行計算密集的任務,瀏覽器可能變得無法響應,可能會導致使用者認為瀏覽器奔潰了。
如果應用程式必須執行足夠的計算從而導致顯著的延遲,應該允許文檔在執行這個計算之前完全載入,應該確保能夠通知使用者計算進行中中並且瀏覽器沒有掛起。如果可能將計算分解為離散的子任務,可以使用setTimeout( )和setInterval( )這樣的方法在後台運行子任務,同時更新一個進度列指示器來向使用者顯示反饋。