(个人理解 ES6 就是对 ES5 的 BUG 修改和升级) 废话不多说今天要探讨的是 var 与 letECMAScript 6 入门 作者:阮一峰
下面是个人总结:let 不允许在相同作用域内,重复声明同一个变量。lef 特点是块级作用域
先来看一下 ES5 中时常出现的变量提升的问题!
var tmp = new Date();
function f() {
console.log(tmp);
if(false) {
var tmp = ‘hello world’;
}
console.log(tmp);
}
输出结果为 undefined,原因在于变量提升,导致内层的 tmp 变量覆盖了外层的 tmp 变量。
在 ES6 的语法中解决的变量提升的问题 是这么实现的!
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
这里大家可以自己试验 将内层 和外层的 n 分别用 var let 来定义 就发现 let 不允许在相同作用域内,重复声明同一个变量。lef 特点是块级作用域 let 的特点得到明显的体现!
再看一个 ES5 中的循环变量泄露为全局变量
var s = ‘hello’;
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
很明显 i 成了全局变量。ES6 中
for (let i = 0; i < 10; i++) {
// …
}
console.log(i);
// ReferenceError: i is not defined
这表明,let 声明的变量只在它所在的代码块有效。
本人目前了解的还不够深!比如 ES6 中添加一个新的词汇“暂时性死区”(temporal dead zone,简称 TDZ)。
var tmp = 123;
if (true) {
tmp = ‘abc’; // ReferenceError
let tmp;
}
我可以把它理解为 ES6 解决不了的 BUG!非要给他定义成一个词汇么?(笑死)!也希望大牛前来解答探讨!