Skip to content

块级作用域

ES6(ECMAScript 2015)引入了块级作用域的概念,这是通过新增的 letconst 关键字实现的。在 ES6 之前,JavaScript 仅具有全局作用域和函数作用域,使用 var 声明的变量会在这两种作用域中生效,但不会受到代码块(如 if 语句或循环)的影响。

使用 let 声明变量

  • 块级作用域:当使用 let 在一个块(由一对花括号 {} 包围的一段代码)中声明一个变量时,该变量只在该块内有效。

    javascript
    {
      let x = 2;
    }
    console.log(x); // 报错,x is not defined
  • 暂时性死区(Temporal Dead Zone, TDZ):从代码块开始到 let 声明变量之间的区域被称为“暂时性死区”。在这一区域内,尝试访问该变量会导致错误。

    javascript
    console.log(x); // ReferenceError: x is not defined
    let x = 3;

使用 const 声明常量

  • 常量与块级作用域const 用于声明常量,并且也遵循块级作用域规则。但不同于 let,一旦声明并赋值后,const 定义的常量不能被重新赋值。不过要注意的是,如果 const 变量是一个对象或者数组,其内容是可以修改的,只是引用本身不可改变。

    javascript
    const y = 5;
    y = 10; // TypeError: Assignment to constant variable.

对比 var

  • 函数作用域 vs. 块级作用域:使用 var 声明的变量不遵循块级作用域规则,而是遵循函数作用域(或全局作用域)。这意味着即使在块内部使用 var 声明变量,在块外部也可以访问它。

    javascript
    if (true) {
      var z = 7;
    }
    console.log(z); // 输出 7

总之,ES6 中的 letconst 提供了更细粒度的作用域控制,使得代码更加安全、清晰和易于理解。它们帮助开发者避免了由于变量提升和其他 var 相关问题导致的错误。

Released under the MIT License.