let类似于var,不过它只在当前代码块中生效,
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
在它的代码块外面,这个let a是找不到的,所以会显示未找到a。
- 在for循环中就适合使用let,当它执行完毕了let的数据也就跟着销毁了
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);
// ReferenceError: i is not defined
这里执行会发现找不到i
- 暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
常见案例
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
这里为什么会报错呢?
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
只要let声明写在后面,前面就调用赋值,前面就一定会报错
但是到后面let声明后面的时候,输出它,会显示undefined
说明赋值没有进去,这种叫做暂时性死区
- 看案例
if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ结束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
- 不允许重复声明
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
let不允许在相同作用域内,重复声明同一个变量。
想想你的文章写的特别好https://www.ea55.com/
不错不错,我喜欢看 https://www.ea55.com/
看的我热血沸腾啊www.jiwenlaw.com
想想你的文章写的特别好www.jiwenlaw.com