1.基本用法
let的用法与var基本类似,但仅在其声明的代码块内作用
{
var a = 123;
let b = 456;
}
console.log(a);
console.log(b); //ReferenceError: b is not defined
同理,在循环语句里也可以体现
for(var i = 0; i < 4; i++){
}
for(let j = 0; j < 5; j++){
}
console.log(i); //4
console.log(j); //ReferenceError: j is not defined
2.不存在变量提升
可以理解为var的镜面效果。由let声明的变量不能在该变量声明之前使用,否则会报错。而由var声明的变量可以提前使用,但值为undefined。关于“什么是变量提升”可以查看上一篇文章。
console.log(b);
let b = 2; //ReferenceError: Cannot access 'b' before initialization
console.log(a); //undefined
var a = 1;
3.暂时性死区
在一个代码块中,由let声明的变量,在其声明之前该变量是不能使用的。这个区块对这些let声明的变量,从一开始就形成了封闭作用域。而这个封闭作用域就是“暂时性死区(temporal dead zone,简称 TDZ)”
if(true){
//TDZ开始
a = 1; //ReferenceError: Cannot access 'a' before initialization
console.log(a); //ReferenceError: Cannot access 'a' before initialization
let a; //TDZ结束
console.log(a); //undefined
a = 2;
console.log(a); //2
}
4.不允许重复声明
if(true){
var a; //SyntaxError: Identifier 'a' has already been declared
let a;
}
if(true){
let a; //SyntaxError: Identifier 'a' has already been declared
let a;
}
function fun(a){
let a; //SyntaxError: Identifier 'a' has already been declared
}
fun();