1, 基本语法:
let命令。用于声明变量 。其用法类似于var,但是所声明的变量只在let命令所在的代码内有效。
{
let a = 10;
var b = 1;
} //let 声明的变量只在其所在的代码块内有效。
// a a is not defined
// b 1
//for循环的计算器很适合使用let命令。
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
};
a[6](); // 10
//因为变量 i是var声明的,在全局范围内都有效,所有全局变量只有一个变量。
//所有的的数组a的成员的i指向的都是同一个i 导致运行时输出的最后一轮的i 也就是10.
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
};
a[6](); // 6
//变量i是let声明的,当前的i只有在本轮循环有效,所有每次循环循环的其实都是一个新的变量,
//于是最后输出的是6.
//for循环还有个特别之处,就是设置循环变量的那部分是一个父作用域,而每次循环体内部是一个单独的子作用域。
for (let i = 0; i < 3; i++) {
let i = "abc";
console.log(i);
}
// abc
// abc
// abc
// 输出3次 abc 表示函数内部的变量i与循环变量与循环变量i不在同一个作用域,而是有个子单独作用域。,
2,不存在变量提升
let命令:它所声明的变量一定要在声明之后使用,否则会报错。
console.log(foo);
var foo = 2;
// 因为脚本运行开始时 变量foo就存在 但是没有值 所以输出 undefined
console.log(foo);
let foo = 2;
// let命名声明不会发生变量提升 所有会 报错
3,暂时性死区
只要块级作用域内存在let命令,它所声明的变量就帮“绑定”这个区块在受外部的影响。
ES6明确规定 如果区块中存在let const命令 ,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要声明之前就就使用这些变量,就会报错。
4.不允许重复声明
let :不允许在相同作用域内重复声明同一个变量。
function(){
let a = 1;
var a = 2;
} //报错