let/const 和 var
- let/const有块级作用域
- var有变量提升
- let/const声明前不能使用(暂时性死区)
- let/const不能被重复声明
- const声明的变量不能被改变(复杂数据类型可以改变其属性,不能改变引用地址)
注:
- for循环中函数内部变量i和循环变量i在不同的作用域,属于父子作用域关系
- typeof 在let出现之后变得不安全了,当检测处于暂时性死区的变量时,会报一个ReferenceError的错误。
- 不易发现的死区
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;
// ReferenceError: x is not defined