let块级作用域
只对大括号内元素有效
{
let a=3;
console.log(a);//a=3
}
console.log(a);//Uncaught ReferenceError: a is not defined
for循环对let的命令的使用
for (let i = 0; i < 10; i++) {
// 计数器i只在for循环体内有效,在循环体外引用就会报错
}
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
var b = [];
for (let j = 0; j < 10; j++) {
b[j] = function () {
console.log(j);
};
}
b[6](); // 6
for循环的(父作用域)该部分是单独的作用域
for循环的{子作用域}
let的其他属性
1、let不允许在相同作用域内,重复声明同一个变量
2、var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined;
let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
3、ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错
let a =1;
const b =2;
var c =3;
console.log(window.a);//undefined
console.log(window.b);//undefined
console.log(window.c)//3
let默认值
let [foo = true] = [];
let [x, y = 'b'] = ['a'];
console.log(foo,x,y);//true a b
let [x = 1] = [undefined]; //x: 1
console.log(x);
let [x = 1] = [null]; //x: null
console.log(x);
陷阱
let x; {x}={x: 1};
上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。
正确写法
let x; ({x} = {x: 1});