在 JavaScript 中,变量的作用域决定了它在代码中的哪个位置可以被访问。
变量可以在不同的作用域中声明
- 全局作用域
- 局部(函数)作用域
- 块级作用域
例如,
function addNumbers() {
var sum = 5 + 4;
}
在这里,sum 变量是在 addNumbers()
函数内部创建的。
因此,它只能在该函数内(局部或函数作用域)访问。这种变量被称为 **局部变量**。
注意: 根据变量声明的作用域,变量可以分为
- 全局变量
- 局部变量
- 块级变量
JavaScript 局部变量
当变量在函数内部声明时,它们具有局部作用域,只能在该函数内部访问。
这类变量称为局部变量。例如:
function greet() {
// local variable
var message = "Hello";
console.log(`Local: ${message}`);
}
greet();
// try to access message variable
// outside the greet() function
console.log(`Global: ${message}`);
输出
Local: Hello ERROR! ... ... ... ReferenceError: message is not defined
在这里,message 变量是 greet()
函数的局部变量。因此,它只能在该函数内部访问。
这就是为什么当我们尝试在 greet()
函数外部访问它时会出错的原因。
要解决此问题,我们可以将 message 变量设为全局变量。
JavaScript 全局变量
在 JavaScript 中,在任何函数外部或全局作用域中声明的变量称为全局变量。
全局变量可以在函数内部和外部访问。例如:
// declare global variable
var message = "Hello";
function greet() {
console.log(`Local: ${message}`);
}
greet();
console.log(`Global: ${message}`);
输出
Local: Hello Global: Hello
在这里,我们可以从 greet()
函数外部访问 message 变量。
这是可能的,因为我们将 message 变量创建在全局作用域(函数外部)。
因此,message 将可以从程序的任何作用域(区域)访问。
全局变量的值可以在函数内部更改。例如:
// Program to show the change in global variable
let a = "hello";
function greet() {
// change value of global variable a
a = 3;
}
// before the function call
console.log(a);
// Output: hello
greet();
//after the function call
console.log(a);
// Output: 3
在这里,我们将全局变量 a 初始化为字符串值 hello
。然后,我们在 greet()
函数内部将其值更改为 **3**。
注意:避免使用全局变量是一个好习惯,因为全局变量的值可以在程序的各个区域中更改。这可能导致不可预知的结果。
在 JavaScript 中,变量也可以在使用时不声明。
如果变量在使用时不声明,该变量会自动成为全局变量。例如:
function greet() {
a = "hello"
}
greet();
console.log(a); // hello
在上面的程序中,变量 a 是一个全局变量。
如果使用 let a = "hello"
声明该变量,程序将抛出错误。
注意:JavaScript 有一个 严格模式,在该模式下,变量不能在未声明的情况下使用。
JavaScript 块级变量
JavaScript ES6 引入了使用 let
和 const
关键字的块级作用域。
块级变量只能在其定义的块 {}
中访问,而该块可能比函数的范围更小。例如:
function display_scopes() {
// declare variable in local scope
let message = "local";
if (true) {
// declare block-level variable
let message = "block-level";
console.log(`inner scope: ${message}`);
}
console.log(`outer scope: ${message}`);
}
display_scopes();
输出
inner: block-level outer: local
在此示例中,我们创建了两个单独的 message 变量
- 块级: `if` 块内的变量(仅在那里可见)。
- 局部级:
display_scopes()
函数内的变量。
let
关键字是块级作用域(变量只能在直接的块中访问)。
让我们看一个例子。
// Program showing block-scoped concept
// global variable
let a = "Hello";
function greet() {
// local variable
let b = "World";
console.log(a + " " + b);
if (b == "World") {
// block-scoped variable
let c = "hello";
console.log(a + " " + b + " " + c);
}
// variable c cannot be accessed here
console.log(a + " " + b + " " + c);
}
greet();
输出
Hello World Hello World hello ERROR! ... ... ... ReferenceError: c is not defined
这里,
- a 是一个全局变量。它可以在程序的任何地方访问。
- b 是一个局部变量。它只能在
greet()
函数内部访问。 - c 是一个块级作用域变量。它只能在 `if` 块内部访问。
因此,在上面的程序中,前两个 console.log() 语句可以正常工作。
但是,当我们尝试在 `if` 语句外部访问块级作用域变量 c 时会出错。
另请阅读