JavaScript 变量作用域

在 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 引入了使用 letconst 关键字的块级作用域。

块级变量只能在其定义的块 {} 中访问,而该块可能比函数的范围更小。例如:

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` 是块级作用域

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 时会出错。


另请阅读

视频:JavaScript 变量作用域

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战