细说 let 与 var 的不同之处
最近看了阮一峰大大的《es6 标准入门》,感觉写的很详细,今天就给各位读者老爷们详细的说一下 let 与 var的不同之处,有不严谨的地方还请多多指教
基本用法
{
let a = 10;
var b = 20;
}
console.log(a) // undefined
console.log(b) // 20
在代码块中用 let 和 var 分辨定义了 a 和 b 两个变量,但是在代码块外面调用这两个变量,a 返回undefined,b返回正确的值,这就表明了
let 声明的变量只在其所在的代码块中有效
再来一个例子
for(let i = 0;i < 9;i++){
setTimeout(function(){
console.log(i) // 0~8
},1000);
}
for(var i = 0;i < 9;i++){
setTimeout(function(){
console.log(i) // 9个9
},1000);
}
在这段代码中,用 let 的 for 循环最终打印出来的是 0~8;而用 var 的 for 循环最终打印出来的是 9 个 9。
这就是说明了 let 声明的变量 i 只在本轮循环有效,所以每一次的 i 都是一个新的变量,并不会覆盖上一次循环出来的 i ;而 var 声明的变量在每一次循环 i 都会被新的 i 值所覆盖,最终打印出来的是 9 个 9.
先声明再使用
let 并不像 var 那样会存在“变量提升”的现象,所以一定要先声明之后再使用,否则会报错的;
例如:
console.log(a) // ReferenceError
let a = 222;
还有一种
var a = 222;
if (true) {
a = 666;
let a;
}
console.log(a); // ReferenceError: a is not defined
上面的代码中存在着全局变量 a ,但是在 if 这个作用域内 let 又声明了一个局部变量 a ,导致了 a 绑定了 if 这个作用域,所以调用 a 的话会报错。
ES6 明确规定,如果区块中存在 let 和 const 命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要在声明之前使用这些变量,就会报错。
还有一种情况,比较隐蔽,例如:
function test1(x = y;y = 222){
return [x,y];
}
test1(); // 报错
function test2(x = 222;y = x){
return [x,y];
}
test2(); // [222,222]
所以,let 一定要先声明变量在使用
不允许重复声明
let 跟 var 不同,在同一个作用域内,var 可以重复声明同一个变量,但是 let 是不允许的。
下面这几种情况都是不被允许的:
function fun1(){
let a = 10;
var a = 20; // 报错
}
function fun2(){
let b = 10;
let b = 20; // 报错
}
function fun3(a){
let a = 10; // 报错
}
let 不允许在相同作用于内重复声明同一个变量,而且不能在函数内部重新声明参数
下面这种情况可以:
function fun(a){
{
let a = 10;
}
}
关于 let 和 var 之间的一些小小区别暂时就到这里了,再次感谢阮一峰大大的《ES6标准入门》,有不严谨的地方欢迎各位读者老爷们指正。