在ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
先看一段代码,用var
定义变量:
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
再看用
let
定义变量:
let a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log("a[6]的值为:"+i);
};
}
a[6]();
同样是两个
for
循环计数器,用var
定义的输出的结果是10,而用let
定义的输出结果是6.原因就在于:
1、用var声明的变量,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。
2、用let声明的变量,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
在用var
声明变量时可以在声明之前使用,值为undefined
,而let声明变量时,它所声明的变量一定要在声明后使用,否则报错。只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。总之,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。