當我們在JavaScript中討論“變量域”時,我們實際上是在談論變量的作用域(Scope)。作用域決定了變量在代碼中的哪些部分是可訪問的。JavaScript中的變量作用域主要有兩種:全局作用域和局部作用域(包括函數作用域和塊級作用域,盡管塊級作用域是通過let和const在ES6中引入的)。
全局作用域:
在任何函數之外的變量都擁有全局作用域。
這意味著這些變量可以在代碼的任何地方被訪問。
使用var在函數外部聲明的變量或在函數內部未使用var、let或const聲明的變量會成為全局變量(在嚴格模式下,未聲明的變量會導致錯誤)。
javascript
複製
var globalVar u003d "我是全局變量";
function test() {
console.log(globalVar); // 可以訪問全局變量
}
test(); // 輸出 "我是全局變量"
局部作用域:
函數作用域:在函數內部聲明的變量(使用var、let或const)擁有函數作用域。這些變量隻能在其被聲明的函數內部訪問。
javascript
複製
function test() {
var localVar u003d "我是局部變量";
console.log(localVar); // 可以訪問局部變量
}
test(); // 輸出 "我是局部變量"
console.log(localVar); // ReferenceError: localVar is not defined
塊級作用域(ES6+):使用let或const在代碼塊(如{}內部)中聲明的變量具有塊級作用域。這些變量隻能在其被聲明的代碼塊內部訪問。
javascript
複製
if (true) {
let blockScopedVar u003d "我是塊級變量";
console.log(blockScopedVar); // 可以訪問塊級變量
}
console.log(blockScopedVar); // ReferenceError: blockScopedVar is not defined
結合
var a u003d 1
console.log(a)//輸出1
function test(){
console.log(a)//輸出undefined因為是塊級作用域內,var為塊級內全局,同時輸出為函數內變量此時還沒定義
var a u003d 3
console.log(a)//輸出3
}
注意:在JavaScript中,每個函數都會創建一個新的作用域。這意味著在函數內部聲明的變量不會與在函數外部聲明的同名變量衝突。此外,由於JavaScript中的函數是一等公民,因此它們可以作為參數傳遞,也可以從其他函數中返回,但即使這樣,它們的作用域規則仍然適用。
理解作用域對於編寫無錯誤、可維護的JavaScript代碼至關重要。