跳到主要内容

JavaScript 变量作用域

提示
  1. 变量作用域的概念:在JavaScript中,变量作用域指的是变量和函数在代码的特定部分可用性,主要分为全局作用域和局部作用域。
  2. 全局作用域:在程序顶部或函数外部声明的变量是全局变量,它们可以在程序的任何地方使用。全局变量的值可以在函数内部改变。
  3. 局部作用域:在函数内部声明的变量具有局部作用域,仅在该函数内部可访问。let关键字声明的变量是块级作用域,仅在声明它的代码块内部可访问。

作用域指的是变量和函数在代码的某些部分的可用性。

在JavaScript中,变量有两种类型的作用域:

  1. 全局作用域(Global Scope)
  2. 局部作用域(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被视为局部变量。

要了解更多关于letvar的区别,请访问 JavaScript let vs var