1.变量提升
在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在哪声明的,都会被当成在当前作用域顶部声明的变量。如:
function getValue(condition) {
if (confition) {
var value = 'blue';
}
// 此处可访问value,为undefined
}
js预编译时会改成:
function getValue(condition) {
var value;
if (confition) {
value = 'blue';
}
// 此处可访问value,为undefined
}
2.块级声明
声明在指定块的作用域之外无法访问的变量。
不同层级声明会被遮蔽,相同层级声明则会抛出错误,如:
var count = 30;
let count = 40; // 抛出语法错误
var count = 30;
if (condition) {
let count = 40; // 遮蔽全局的count
}
const声明并初始化常量,不能再被赋值;但如果常量是对象,允许修改值,不允许修改绑定;如:
const person = {
name: 'nicholas'
};
person.name = 'Greg'; // 可以修改对象属性
// 抛出语法错误
person = {
name: 'Greg'
};
3.临时死区
js引擎在扫描代码发现变量声明时,要么将它们提升至作用域顶部(var声明),要么将声明放到临时死区(TDZ)中。访问TDZ中的变量会触发运行时错误,只有执行过变量声明语句后,变量才会从TDZ中移除,然后方可正常访问。
if (condition) {
console.log(typeof value); // 引用错误
let value = 'blue';
}
console.log(typeof value); // undefined,此时value并不在TDZ中
if (condition) {
let value = 'blue';
}