ES6 变量声明——let 和 const
2024-01-09 15:51:21
变量声明——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 中变量提升带来的问题。