ES6 入门 第一章(let与var)

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每循环一次就是一个独立的块级作用域); 读了上述内容后,读者应该不难想到上面的输出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值