一、var关键字
1.var声明作用域
使用var操作符声明的变量会成为包含它的函数的局部变量:
function fun() {
var variable = "hello";
console.log(variable);
};
fun(); // 结果是hello
console.log(variable);
// 结果是Uncaught ReferenceError: variable is not defined
2.var声明提升
使用var操作符声明的变量会自动提升到它所在的函数作用域的顶部:
function fun() {
console.log(variable); // 在这里先访问
var variable = "hello";
}
fun(); // 结果是 undefined
这就是所谓的“提升”(hoist),也就是把所有变量声明(var操作符声明的)都拉到函数作用域的顶部。
3. var操作符可以重复声明同一个变量
var variable = 1;
var variable = "hello";
var variable = true;
console.log(variable); // true
二、let关键词
1.let声明作用域
let声明的范围是块级作用域 (一对{ }内)。
注意:这里就和 var 声明的作用域有区别了。
2.不能在同一个块内重复声明
和var又一个区别是,let操作符不允许在同一个块作用域中重复声明变量。
3.暂时性死区
与var又一个很重要的区别是,let声明的变量不会在它所在的作用域中被提升,对暂时性死区可以理解为,在代码块内,使用let声明变量之前,该变量都是不可用的。
4.for循环中的let声明
在 let 出现之前,for 循环定义的迭代变量会渗透到循环体外部:
for (var i = 0; i < 5; ++i) {
// 循环逻辑
}
console.log(i); // 5
三、const关键字
const 的行为与 let 基本相同(块级作用域、暂时性死区、不允许重复声明等)