ES6中的let命令

ES6新增了let命令,用于声明变量。其用法类似var,区别是使用let命令声明的变量只在当前代码块有效。

for循环的计数器就很适合使用let命令。

var arr= [1,2,3,4,5];
for(var i=0;i<arr.length;i++){
       //something to do...
} 
alert(i); //运行结果为5,但如果使用let,会报错i is not defined

下面的代码如果使用var,最后将输出10;

1 var a = [];
2   for(var i = 0;i<10;i++){
3       a[i] = function(){
4        alert(i);
5      }
6   }
7 var func = a[7];
8 func();

这是因为变量i使用var声明,在全局范围内有效,每次循环新的i值就会覆盖旧值。

而如果使用let声明变量,i只在本次循环中有效,所以以下代码的输出结果为7。

1 var a = [];
2     for(let i = 0;i<10;i++){
3         a[i] = function(){
4           alert(i);
5         }
6     }
7 var func = a[7];
8 func();

使用let声明变量,变量一定要在声明后使用,不然会报变量未定义的错误。

1 console.log(str);
2 var str = "111" //undefined
3 // let str = "111"; //str is not defined

上面的代码如果使用var声明变量str,仅仅会输出变量undefined。而使用let命令声明,则会抛出str is not defined异常。

只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。ES6规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,只要在声明之前使用这些变量就会报错。这在语法上称作“暂时性死区”(temporal dead zone)。

1 var tmp = 123;
2 if(true){
3      tmp = "abc"; //tmp is not defined
4      let tmp; //将声明的变量绑定到这个区域,不再受外部影响
5 }

查看代码运行效果

 参考阮一峰《ES6标准入门》