let是ES6之后用于解决js没有块作用域的问题
1.let在同一作用域内不能重复声明
2.var存在变量提升
3.let会存在暂时性死区,因为不允许在未声明前使用
4.var作用域仅为函数作用域与全局作用域,let可以有块作用域
例子
let x = 10;
let foo = () => {
console.log(x);
let x = 20;
x++;
}
foo();
这段代码会引“ReferenceError”错误,
如果变成这样
let x = 10;
let foo = () => {
console.log(x);
x = 20;
x++;
}
foo();
输出10,foo会顺着作用域链找到x=10。
函数提升:
上面的代码其实是这样的
let foo = () => {
console.log(x);
x = 20;
x++;
}
let x = 10;
foo();
函数会优于变量提升,放到变量提升的前面
一个问题:既然能够顺着作用域链访问之前的变量,为什么会报“ReferenceError”错误?
因为在同一个作用域里面,其实let也会有变量提升的,但js不允许在这个作用域里面出现这种情况:
变量在声明之前使用
一旦出现这个情况,就算在全局变量已经声明了也会报错。
例:
let x = 10;
if(true){
console.log(x)
let x=2
}
也会报错,js只是单纯地表示在同一作用域中,let不能在未声明前使用