let 声明了一个块级域的局部变量,并且可以给它一个初始化值。
1,let和var的作用域不同:
let 允许把变量的作用域限制在块级域中。
var 申明变量要么是全局的,要么是函数级的,而无法是块级的。
function test() {
var x = 2;
if (true) {
var x = 1;
console.log(x);
}
console.log(x);
}
结果为:
1
1
因为var的作用域是函数级,所以if大括号里的var x = 1给x赋予了新值。下面的输出也为新值。
function test() {
let x = 2;
if (true) {
let x = 1;
console.log(x);
}
console.log(x);
}
结果为:
1
2
let作用域是块级别的,if里面的let x = 1为一个新变量,if结束之后消失,与上面的x无关,所以输出依然是2.
2,let 有暂存死区
function test() { var x; var x; } //不会发生错误
function test() { let x; let x; } //会引起TypeError异常
因为在 ECMAScript 2015中, let
将会提升这个变量到语句块的顶部。然而,在这个语句块中,在变量声明之前引用这个变量会导致一个 ReferenceError的结果
, 因为let变量 在"暂存死区" (从块的开始到声明这段).
3,let与var对比
var a = 5; var b = 10; if (a === 5) { let a = 4; var b = 1; console.log(a); console.log(b); } console.log(a); console.log(b);
结果为:
4 1 5 1 //因为var和let作用域不同,if大括号内的let a在大括号结束后消失,而b为var,作用域是函数,所以为1