返回首页

ES6 笔记:let 和 const

参照阮一峰《ES6 入门》整理的笔记,本篇覆盖 let 和 const。

发布 2016年11月16日 标签 #javascript #es6

~/posts/es6-let-and-const $ cat post.md

/ 语言 EN / 中文
/ 主题 / /

参考阮老师《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

返回首页