全局變量
與某些編程語言不同,JavaScript並沒有一種可以聲明全局變量的關鍵字,有的只是全局變量的功能。
-
在最外層的作用域,也就是
window用var聲明的變量就是全局變量。 -
在函數內部,不用關鍵字聲明變量,直接賦值,這時也是個全局變量
var a = 1;
function bar(){
var a = 10;
function foo(){
console.log(a); // 10
console.log(window.a); // 1
}
foo()
}
bar();
因為在最外層的變量,會被作為window的屬性,前提是用var聲明,這時候就算函數內部聲明了相同的變量,依然可以通過window對象找到外部定義的變量,這就有了全局變量的功能。
var b = 2;
function bar(){
b = 10; //通過LHS引用的最外層的b,並賦值,這不是聲明
d = 4; // 全局,作為window的屬性
console.log(b); // 10
}
bar();
console.log(b); // 10
console.log(d); // 4
這是因為不成功的LHS引用,在非嚴格模式下,會自己創建一個全局變量。如果是不成功的RHS引用就會直接報錯。
雖然這樣也能聲明,但最好不要,因為在嚴格模式下,是不允許不使用關鍵字就聲明變量的。
所以真的想要全局變量,請使用第一種方法。
至於局部變量,那就多了,函數作用域和塊作用域里聲明的都是局部變量。
