一:變量作用域
在js代碼中每個變量都是有自己的作用域的,js中不像C語言有塊級作用域的概念,取而代之的是函數作用域,看如下代碼:
var scope="global";
function init(){
alert(scope);
var scope = "local";
alert(scope);
}
function testScope(){
alert(scope);
}
在上述代碼中第一個scope輸出的是undefined,第二個scope輸出的是local,第三個scope中輸出的是global。我們首先分析var scope="global";這個是一個全局變量,var scope = "local";這個是一個局部變量作用域在函數init體內,但是js中的聲明函數是先聲明后賦值的,并且聲明永遠置頂,并且在函數體內如果存在變量名稱與全局變量名稱相同會優先取局部變量,因此上面的代碼可以修改為:
var scope="global";
function init(){
var scope;
alert(scope);
scope = "local";
alert(scope);
}
function testScope(){
alert(scope);
}
基于以上代碼就可以得出之前的結論。
但是注意一下,如果代碼變成如下:
var scope="global";
function init(){
alert(scope);
scope = "local";
alert(scope);
}
function testScope(){
alert(scope);
}
那么輸出結果會global,local,local。因為在函數體內,如果變量不用var聲明,那么這個變量就是全局變量,會覆蓋掉之前var scope="global";聲明的全局變量,因此會在testScope函數中值會變成local。
?
因此,在實際編碼中建議將變量聲明放在函數頂部,而不是靠近使用這個變量的地方,這樣對函數的作用域會有清晰的認識。