新增let
和const
let
和const
是ES6新增的声明变量的命令
let
用于声明变量
const
用于声明常量
关于let
和const
相对于var
的区别:
1.let
和const
声明的变量属于块作用域,而var
声明的变量属于全局作用域和函数作用域
{
var foo = 1
}
console.log(foo)
// output: 1
{
let bar = 2
}
console.log(bar)
// output: ReferenceError: bar is not defined
2.var
声明的变量可以在同一个作用域内不能重复声明
var num = 10
var num = 1
console.log(num)
// output: 1
let
和const
声明的变量在同一个作用域内不能重复声明
let num = 10
let num = 1
// output: SyntaxError: Identifier 'num' has already been declared
3.使用var
声明变量,存在“变量提升”的现象,即变量可以在声明之前使用,默认值为undefined
console.log(num)
// output: undefined
var num = 10
使用let
和const
则不存在“变量提升”
console.log(num)
// output: ReferenceError: num is not defined
let num = 10
关于暂时性死区(TDZ:temporal dead zone)
ES6 明确规定,如果区块中存在let
或const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前调用这些变量吗,就会报错
let tmp = 1
if (tmp) {
tmp = 0
// 因为下面使用 let 重新声明了 tmp,所以形成了TDZ
let tmp = 2
console.log(tmp)
// output: ReferenceError: tmp is not defined
}