ES6 入门 第一章(let与var)
声明:ES6入门系列博客是笔者读完 阮一峰先生的《ES6标准入门(第三版)》 后的总结
let与var
传闻,var是js设计者最大的败笔,那魔鬼般的全局变量,曾让无数人发飙~~
ES6的一声炮响,给我们带来了let(主义)。let,一个只在块级作用域内有效的声明方式。
先来看看革命成果吧!
第一点:
var命令会带来变量提升(看代码更容易懂,就不做说明了),而let则不存在变量提升。
console.log(a); // undefined (被定义,但没有值)
var a = 4;
console.log(b); // ReferenceError: b is not defined(报错)
let b = 5;
为什么会这样呢?
其实,不管是let还是var命令,在代码编译的时候,这些变量已经存在了(即使在代码还没有运行到该变量声明语句)。而造成var和let命令的差异在于:let做出了限制(即:代码还没运行到变量声明代码时,该变量不能被提取),而var并没有这样的限制。
第二点:
刚刚讲了let的好处,那接下来讲个坏处
let命令会给声明的变量带来暂时性死区
var b = 1;
if (true) {
console.log(b); // ReferenceError: a is not defined
let b;
}
let a = 3;
if (true) {
console.log(a); // ReferenceError: a is not defined
let a;
}
不管是var声明的变量还是let的声明的变量,只要在其子代码块中,使用相同的变量名进行let声明,就会带来暂时性死区。 不过这点小问题是掩盖不了let相对于var的优越性,不信?接着看!
第三点
这个是let革命最重要的成果:let声明的变量只在块级作用域内有效。
var arry1 = [];
for (var i = 0; i < 10; i++) {
arry1[i] = () => {
console.log(i);
};
}
arry1[5](); // 10
var arry2 = [];
for (let j = 0; j < 10; j++) {
arry2[j] = () => {
console.log(j);
};
}
arry2[5](); // 5
几乎同样的代码,为什么会出现这样的差别呢?
因为啊,var所声明的都是全局变量,也就是说第一个·for循环中的循环变量 i 始终是同一个,当循环结束时,i为10;arry1[]数组中定义的所有函数的输出自然都是 10。
而let 声明的变量只在块级作用域中有效(for每循环一次就是一个独立的块级作用域); 读了上述内容后,读者应该不难想到上面的输出结果。