JavaScript中的变量声明:let

2020-11-13大约6分钟

ES6引入了let关键字来声明所有类型的数据(如布尔值,对象,整数等)的变量。

在上一篇文章《JavaScript中的变量声明:var》中,我们讨论了JavaScript中用var关键字的作用域及提升。

let

  • 在Javascript中,let关键字声明了一个块作用域变量。
  • 不能再次声明相同的变量,但可以再次对其进行赋值。
  • let声明的变量不会被提升(hoisted)。
  1. 语法

下面的例子中,我们用let来声明两个变量xy

let x = 5;
console.log(x); // 5

let y;
y = false;
console.log(y); // false

2. 块作用域

let声明的变量会创建块作用域。

示例1:

let range = 10;
if (range > 10) {
  let food = "Pizza";
  console.log(food); //Pizza
}
console.log(food); // ReferenceError: food is not defined

这里let创建了一个块作用域,food只能在if语句块中访问,出了if语句就不能再访问。

示例2:

for(let i = 0; i < 5; i++) {
    // do something
}
console.log(i); // ReferenceError: i is not defined

因为i的作用域只有在for循环里面,因此在for语句之外无法访问变量i

3. 重新声明和初始化

使用let我们无法重新声明变量,否则JavaScript引发语法错误。一个变量只能声明一次,但是变量可以用任何值重新初始化。

不能重新声明

let a = true;
let a = false;
console.log(a); 
// SyntaxError: Identifier 'a' has already been declared

重新赋值

let a = true;
a = false;
console.log(a); // false

注意:如果我们仅使用let声明变量而未赋值,则其默认值是undefined,而不是null。稍后,当代码执行到变量赋值时,新值将替换undefined值。

let a;
console.log(a); // undefined

a = 10;
console.log(a); // 10

4. 不会被提升

let声明不会被提升,因此,如果我们尝试在声明变量之前访问变量,则Javascript会引发错误。

str = "hello";
let str;
// ReferenceError: Cannot access 'str' before initialization