ES6 笔记:let 和 const
参照阮一峰《ES6 入门》整理的笔记,本篇覆盖 let 和 const。
发布 2016年11月16日 标签
#javascript
#es6
~/posts/es6-let-and-const $ cat post.md
参考阮老师《ES6 入门》整理,仅供自己复习。
概览
和 var 不同,let 的作用域仅限于所在的代码块,比如 for 循环:
for (let i = 0; i < 1; i++) {}
用 let 可以避免循环结束后还能在外部读到最后一次 i 的问题——这种事在 var 时代很常见。
作用域
for 的循环语句和循环体是两个不同的作用域:
for (let i = 0; i < 3; i++) {
let i = "abc";
console.log(i);
}
输出三次 "abc",循环体里的 i 是新声明的。
变量提升
let 不存在变量提升。var 声明的变量则会在代码执行前先被创建为 undefined,等到声明语句时才被赋值:
// var 的情况
console.log(foo); // undefined
var foo = 2;
// let 的情况
console.log(bar); // ReferenceError
let bar = 2;
上面 var foo 还没声明,但已经能作为 undefined 被访问,这就是变量提升。
暂时性死区(TDZ)
var tmp = 123;
if (true) {
tmp = "abc"; // ReferenceError
let tmp;
}
在 let tmp 真正声明之前,块内的 tmp 是不可访问的,直到声明语句执行。
var tmp = 123;
if (true) {
tmp = "abc"; // OK
}
如果块里不再用 let 重新声明 tmp,则正常读写外层的 tmp。