有些語言如C、java都有區塊級作用域,也就是花括號內的每一段程式碼都具有各自的作用域,而且變數在宣告它們的程式碼段之外是不可見的,但是javascript沒有區塊級作用域。 javascript使用函數作用域,即變數在聲明它們的函數體以及這個函數體嵌套的任意函數體內都是有定義的,也即函數內聲明的所有變數在函數體內始終是可見的。這樣就意味著變數在宣告之前就可以使用,這個特性稱為"宣告提前",即javascript函數裡宣告的所有變數都提前至函數的頂端。來看個例子。
var test1 = "guncftest.== (){
console.log(test1);
var test1 = "localVariable";
》 〕 㜀〦.>>>>>>>>>>>>>>>>>>>>>>>>運動.==>>>>>>>>>>>>>>>>>>木>>>>>>>木>木>>木>4成長); 🎜>上述函數執行的結果是:先輸出"undefined",再輸出"localVariable"。
很多人會誤以為結果是:先輸出"globalVariable,再輸出localVariable"。其實不然,由於函數作用域的特性,局部變數在整個函數體始終是有定義的,也即,在函數體內局部變數遮蓋了同名全域變量,但是只有在程式執行到var語句的時候,局部變數才會被真正的賦值。因此,上述過程相當於,將函數內的變數宣告提前至函數體頂部,同時變數初始化留在原來的位置。就相當於以下這個函數
複製程式碼
程式碼如下:> ; function test(){ var test1; //將函數內的變數宣告提前至函數頂端
consteststeststestconstests; "; //賦值
console.log(test1);
}
但是,如果函數內沒有用var聲明變數,情況又有所不同。
複製程式碼
這個函數執行的結果是:先輸出"globalVariable",再輸出"localVariable"。
由於函數體內的test1變數沒有用var聲明,就預設為全域變量,當然就不存在變數事先宣告的問題。第一行就會輸出"globalVariable",而第三行改變了test1全域變數的值,輸出了"localVariable"。