let

let 声明的变量在代码块内有效

1
2
3
4
5
6
7
var a [];
for (let i = 0; i < 10; i++) {
a[i] = function() {
console.log(i);
};
}
a[6](); //6

不存在变量提升

var 命令的变量可以在声明之前使用,值为 undefined

暂时性死区

在代码块内,使用 let 命令声明变量之前,该变量都是不可用的。TDZ(temporal dead zone)

1
2
3
4
5
var temp = 123
if (true) {
temp = "abc" //ReferenceError
let temp
}

有些死区是不易发现的

1
2
3
4
5
function bar(x = y, y = 2) {
//y is not defined
return [x, y]
}
let x = x //ReferenceError: x is not defined

不允许重复声明

1
2
3
4
function foo() {
var a
let a
}