区别:
- var声明的变量,其作用域在该语句所在的函数之内,存在着变量提升的现象。
- let声明的变量,其作用域为该句所在的代码块内,不存在变量提升的问题。
- let相比于var,其不允许在相同作用域内,重复声明同一个变量。
{
let a = 11;
var b = 51;
}
a // Uncaught ReferenceError: a is not defined
b // 51上述的代码的结果说明,let所声明的变量只在其代码块中有效。
var a = [];
for (var i = 0; i < 4; i++) {
a[i] = function () {
console.log(i);
};
//使用var声明,得到4个4
}
a[0](); //4
a[1](); //4
a[2](); //4
a[3](); //4
//使用let声明,得到0,1,2,3 var a = [];
for (let i = 0; i < 4; i++) {
a[i] = function () {
console.log(i);
};
}
a[0](); //0
a[1](); //1
a[2](); //2
a[3](); //3
//使用let声明,得到0,1,2,3上述for循环的例子,我们可以这样理解。当for循环使用let时产生了块级作用域,每次循环块级作用域中的 i 都相互独立,并不像var那样全程共用了一个。因此它输出的结果便与var的结果不同。
var boo=521;
if(true){
boo='abc';//ReferenceError: boo is not defined
let boo;
}
上述代码中,存在着全局变量boo,但是块级作用域内let又声明了一个局部变量boo,导致后者绑定这个块级作用域,所以在let声明变量前,对boo赋值会报错。总而言之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。