返回

ES6 变量声明——let 和 const

前端

变量声明——let 和 const

ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。例如,在以下代码中:

if (condition) {
  var value = 1;
}

console.log(value); // undefined

初学者可能会认为当变量 condition 为 true 时,才会创建 value。当 condition 为 false 时,不会创建 value,结果应该是报错。然而因为 JavaScript 存在变量提升的概念,代码等价于:

var value;
if (condition) {
  value = 1;
}

console.log(value); // undefined

由于变量提升,value 在 if 语句块之前就声明了,因此即使 condition 为 false,value 仍然会被提升到全局作用域,并初始化为 undefined。

为了解决这个问题,ES6 引入了 let 和 const ,使 JavaScript 拥有了块级作用域。

let

let 声明的变量只在声明它的块级作用域内有效。这意味着在块级作用域外无法访问该变量,也无法重新声明该变量。例如,在以下代码中:

if (condition) {
  let value = 1;
}

console.log(value); // ReferenceError: value is not defined

因为 value 是在 if 语句块中声明的,所以它只在该块级作用域内有效。在块级作用域外访问 value 会抛出 ReferenceError。

let 还有一个重要的特性是暂时性死区(Temporal Dead Zone)。在暂时性死区内,无法访问 let 声明的变量,即使该变量已经声明。暂时性死区从 let 声明开始,一直持续到该变量被初始化为止。例如,在以下代码中:

console.log(value); // ReferenceError: value is not defined
let value = 1;

在 value 被初始化之前,访问 value 会抛出 ReferenceError。这是因为 value 处于暂时性死区。

const

const 声明的变量是常量,这意味着它一旦被初始化,就不能被重新赋值。例如,在以下代码中:

const value = 1;
value = 2; // TypeError: Assignment to constant variable.

尝试重新赋值 const 声明的变量会抛出 TypeError。

const 还有一个重要的特性是它必须被初始化。这意味着在声明 const 变量时,必须立即为它赋值。例如,在以下代码中:

const value; // SyntaxError: Missing initializer in const declaration

省略 const 变量的初始化值会抛出 SyntaxError。

let 和 const 的区别

特性 let const
作用域 块级作用域 块级作用域
暂时性死区
可重新赋值
必须初始化

何时使用 let 和 const

一般来说,应该使用 const 声明所有不会被重新赋值的变量。例如,常量、枚举和对象属性等。应该使用 let 声明所有可能被重新赋值的变量。例如,循环变量、函数参数和临时变量等。

总结

let 和 const 是 ES6 中非常重要的两个关键字,它们使 JavaScript 拥有了块级作用域,并解决了 ES5 中变量提升带来的问题。