第一种理解方式: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错误。

参考

05-11 11:18