標籤:變數範圍 瀏覽器 函數 全域 其他 獨立 報錯 先行編譯 範圍鏈
javaScript是一種描述型指令碼語言,由瀏覽器進行動態解析和執行。 頁面載入過程中,瀏覽器會對頁面上傳入的每個js代碼塊進行掃描。 JavaScript是一段一段的分析執行的,在分析執行同一段代碼中,定義式函數會 被提取出來優先執行。函數定義執行完畢後,才會按順序執行其他代碼。
一、代碼塊
JavaScript代碼塊是由一對script開始標籤和結束標籤包裹的一段代碼。 JavaScript是按照代碼塊來進行編譯和執行的,代碼塊之間相互獨立,但是前面執行的變數和方法,後面的代碼塊可以使用。 前面代碼塊報錯,不影響後面代碼塊的執行。
二、前置處理期間和執行期
JavaScript的執行過程分為兩個階段:前置處理期間和執行期。 先行編譯期會對本代碼塊中的所有聲明的變數和函數(此時處理的只是聲明式函數,而非賦值式函數)進行處理,變數和函數只是進行了聲明,並未進行初始化及賦值(即只是分配了記憶體)。
三、執行順序
首先進行預先處理,之後按照代碼的順序執行代碼。
四、聲明式函數和賦值式函數
1.聲明式函數
function Fun(){
}
2.賦值式函數
var Fn = function{
}
五、變數範圍及範圍鏈
函數執行過程中,每遇到一個變數,都會經曆一次標示符解析的過程,決定從哪裡擷取及儲存資料 。該過程從範圍鏈的使用中的物件開始尋找,如果找到了就用這個標示符,如果沒有找到就 繼續搜尋範圍鏈中的下一個對象,如果搜尋完所有的對象都未找到,則認為該標示符未定義。 因此標示符所在的位置越深,讀寫速度越慢,全域變數總是在範圍鏈的最末端,因此編寫代碼時應該盡量少使用全域變數 如果一個跨範圍的對象被引用了一次以上,則先把它儲存到局部變數裡再使用。 因此,如果局部變數和全域變數同名,則程式會使用局部變數而不是全域變數。 var a = "globalStr"; function fun(){ alert(a); var a = "innerstr"; }//彈出undefined。 局部變數a只進行聲明並沒有賦值,因此輸出undefined。
function fun(){
alert(“測試內容1”);
}
fun();
function fun(){
alert(“測試內容2”);
}
fun();
兩次函數調用都輸出“測試內容2"
這表明,在JavaScript分析執行同一段代碼時,定義式的函數會被提取出來優先執行。之後,才會按順序執行 其他的代碼。也就是第一個函數被調用之前已經被第二個函數覆蓋了,因此第一次調用函數也同樣輸出第二個函數的內容。
javaScript代碼執行順序