let
一:作用域
- 基本使用
声明:ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
{
let a = 10;
var b = 12;
console.log(a); // 10
}
console.log(a); // ReferenceError: a is not defined
console.log(b); // 12
- for循环中的应用
下面我们来看一道经典面试题:为什么 i 打印的结果为10 ,怎么才能正确打印呢?
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
解析:上述代码中 i 是用var声明的是全局变量,每一次循环 i 都会进行变化。数组 a 里面的函数内部的 i 指向的是全局的 i ,所以 a 数据里面的 i 和for循环里面的都是同一个 i 从而导致运行时输入最后一轮 i 的值 10解决办法可以使用let。
var b = [];
for (let i = 0; i < 10; i++) {
b[i] = function () {
console.log(i);
}
}
b[5]() // 5
解析:i 是使用let声明的,只在本次循环中有效,每次循环的 i都是一个新的变量,所以最后输入的是5
二:不能重复声明
let不允许在相同作用域内,重复声明同一个变量。
{
var a = 10;
let a = 8; // 报错
}
{
let a = 10;
let a = 20; // 报错
}
function func(fn) {
let fn // 标识符“fn”已被声明
}
function func(fn) {
{
let fn // 没有报错
}
}
四:不存在变量提升
var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。而在ES6中 let改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
console.log(a); // undefined
var a = 10;
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 3;