(个人理解ES6就是对ES5的BUG修改和升级)
废话不多说今天要探讨的是 var与let
ECMAScript 6 入门 作者:阮一峰
下面是个人总结:
let不允许在相同作用域内,重复声明同一个变量。
let 特点是块级作用域
先来看一下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!非要给他定义成一个词汇么?(笑死)!
也希望大牛前来解答探讨!