ES6引入了let
关键字来声明所有类型的数据(如布尔值,对象,整数等)的变量。
在上一篇文章《JavaScript中的变量声明:var》中,我们讨论了JavaScript中用var
关键字的作用域及提升。
let
:let
关键字声明了一个块作用域变量。let
声明的变量不会被提升(hoisted)。1. 语法
下面的例子中,我们用let
来声明两个变量x
和y
:
let x = 5; console.log(x); // 5 let y; y = false; console.log(y); // false
用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
。
使用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
let
声明不会被提升,因此,如果我们尝试在声明变量之前访问变量,则Javascript会引发错误。
str = "hello"; let str; // ReferenceError: Cannot access 'str' before initialization