基本用法:用于变量声明,类似于var,但是所声明的变量只在let命令所在的代码块内有效。
{
let a = 1;
var b = 2;
}
console.log(a); //ReferenceError: a is not defined
console.log(b); // 2
for循环的计数器,就很适合使用let命令
var a = [];
for(var i = 0; i < 10; i++){
a[i] = function(){
console.log(i);
}
}
a[6](); //10
上面代码中,变量i是var声明的,在全局范围内有效,所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i值
使用let,声明的变量仅在块级作用域下有效,最后将输出6
var a = [];
for(let i = 0; i < 10; i++){
a[i] = function(){
console.log(i);
}
}
a[6](); //6
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i值都是一个新的变量,最后输出为6
不存在变量提升
变量一定要在声明之后使用,否则会报错
console.log(a); //ReferenceError
let a = 2;
暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响
var tmp = 123;
if(true){
tmp = "abc"; //ReferenceError
let tmp;
}
上面代码中存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let变量声明前,对tmp复制会报错。
ES6明确规定,如果区块中存在let和const命令,则这个区域对这些命令声明的变量从一开始就形成封闭作用域_。只要在声明之前使用这些变量,就会报错。
function bar(x = y, y = 2){
return [x, y];
}
bar(); //报错
上面代码中,调用bar函数之所以报错,是因为x默认值为y,而y还没有声明,属于“死区”。如果y的默认值为x,就不会报错
function bar(x = 2, y = x){
return [x, y];
}
bar(); //[2, 2]
不允许重复声明
let不允许在相同作用域内重复声明同一个变量
function func(arg){
let arg; //报错
}
function func(arg){
{
let arg; //不报错
}
}
ps:参考自《ES6标准入门》(第2版),阮一峰
只要开始,为时不晚。--2018年10月22号,星期一