第一种理解方式:let和const不能被使用,直到他们被声明
对于var定义的变量,解析器会提升其到作用域顶部。
// Outputs: undefined
console.log(x);
var x = "Now it's defined!";
// Outputs: "Now it's defined!"
console.log(x);
对于let定义的变量,在声明之前使用这些变量,就会报错。
"use strict";
// ReferenceError
console.log(x);
let x = "Now it's defined!";
console.log(x);
另外ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
"use strict";
let x = 10;
if (true) {
"use strict";
// ReferenceError
console.log(x);
let x = 20;
console.log(x);
}
对于函数声明,解析器会提升并定义到作用域顶部。
// Outputs: "Definition hoisted!"
f();
function f() {
console.log("Definition hoisted!");
}
第二种理解方式
所有的定义方式“var, let, const, function, function, class”都存在变量提升,但是var定义的变量被提升初始化为undefined, function/function的变量被提升并被定义相应函数;而let, const, class定义的变量被提升,但没有被初始化,且只能在声明的时候被初始化,不然提前的引用都会报ReferenceError错误。