JavaScript 变量作用域
- 变量作用域的概念:在JavaScript中,变量作用域指的是变量和函数在代码的特定部分可用性,主要分为全局作用域和局部作用域。
- 全局作用域:在程序顶部或函数外部声明的变量是全局变量,它们可以在程序的任何地方使用。全局变量的值可以在函数内部改变。
- 局部作用域:在函数内部声明的变量具有局部作用域,仅在该函数内部可访问。
let
关键字声明的变量是块级作用域,仅在声明它的代码块内部可访问。
作用域指的是变量和函数在代码的某些部分的可用性。
在JavaScript中,变量有两种类型的作用域:
- 全局作用域(Global Scope)
- 局部作用域(Local Scope)
全局作用域(Global Scope)
在程序的顶部或函数外部声明的变量被视为全局作用域变量。
让我们看一个全局作用域变量的例子。
// 程序打印文本
let a = "hello";
function greet() {
console.log(a);
}
greet(); // hello
在上面的程序中,变量a
在程序的顶部声明,是一个全局变量。这意味着变量a
可以在程序的任何地方使用。
全局变量的值可以在函数内部改变。例如,
// 程序展示全局变量的改变
let a = "hello";
function greet() {
a = 3;
}
// 函数调用前
console.log(a);
// 函数调用后
greet();
console.log(a); // 3
在上面的程序中,变量a
是一个全局变量。a
的值为hello。然后在函数内部访问变量a
,值改变为3。
因此,函数内部改变变量a
的值后,a
的值也随之改变。
注意:避免使用全局变量是一个好习惯,因为全局变量的值可以在程序的不同区域发生变化。这可能在程序中引入未知的结果。
在JavaScript中,也可以在不声明的情况下使用变量。如果变量在未声明的情况下使用,该变量自动成为全局变量。
例如,
function greet() {
a = "hello";
}
greet();
console.log(a); // hello
在上面的程序中,变量a
是一个全局变量。
如果变量是用let a = "hello"
声明的,程序会抛出错误。
注意:在JavaScript中,有一个"strict mode"
(严格模式),在这种模式下,未声明的变量不能使用。要了解更多关于严格模式的信息,请访问 JavaScript Strict。
局部作用域(Local Scope)
变量也可以具有局部作用域,即它只能在函数内部访问。
示例1:局部作用域变量
// 程序展示变量的局部作用域
let a = "hello";
function greet() {
let b = "World";
console.log(a + b);
}
greet();
console.log(a + b); // error
输出
helloWorld
Uncaught ReferenceError: b is not defined
在上面的程序中,变量a
是一个全局变量,变量b
是一个局部变量。变量b
只能在greet
函数内部访问。因此,当我们尝试在函数外部访问变量b
时,会发生错误。
let是块作用 域的
let
关键字是块作用域的(变量只能在直接的块内访问)。
示例2:块作用域变量
// 程序展示块作用域概念
// 全局变量
let a = "Hello";
function greet() {
// 局部变量
let b = "World";
console.log(a + " " + b);
if (b == "World") {
// 块作用域变量
let c = "hello";
console.log(a + " " + b + " " + c);
}
// 无法在此处访问变量c
console.log(a + " " + b + " " + c);
}
greet();
输出
Hello World
Hello World hello
Uncaught ReferenceError: c is not defined
在上面的程序中,变量
a
是一个全局变量。它可以在程序的任何地方访问。b
是一个局部变量。它只能在函数greet
内部访问。c
是一个块作用域变量。它只能在if
语句块内部访问。
因此,在上面的程序中,前两个console.log()
没有问题。
然而,我们尝试在块外部访问块作用域变量c
,在第三个console.log()
中会抛出错误。
注意:在JavaScript中,var
是函数作用域的,而let
是块作用域的。如果你在上面程序的if
语句中尝试使用var c = 'hello';
,整个程序可以运行,因为c
被视为局部变量。
要了解更多关于let
与var
的区别,请访问 JavaScript let vs var。