变量提升
var 在变量定义前可以调用
console.log(age) //undefined
var age = 2
let在变量定义前不可调用
console.log(name) //ReferenceError
let name = 'tom'
暂时性死区(temporal dead zone,简称 TDZ)
下面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错
var tmp = 123
if (true) {
tmp = '456'
let tmp // ReferenceError
}
不允许重复声明
// 报错
function () {
let a = 10;
var a = 1;
}
// 报错
function () {
let a = 10;
let a = 1;
}
//报错
function func(age){
let age;
}
// 不报错
function func(arg) {
{
let arg;
}
}
Bug & Tip
ES6明确规定,如果区块中存在let和const命令,
这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。
凡是在声明之前就使用这些变量,就会报错。
function bar(x = y, y = 2) {
return [x, y];
}
bar(); // 报错
function bar(x = 2, y = x) {
return [x, y];
}
bar(); // [2, 2]
// 不报错
var x = x;
// 报错
let x = x;