Page 91 - 你不知道的JavaScript(下卷)
P. 91
考虑:
var funcs = [];
for (let i = 0; i < 5; i++) {
funcs.push( function(){
console.log( i );
} );
}
funcs[3](); // 3
for 循环头部的 let i 不只为 for 循环本身声明了一个 i,而是为循环的每一次迭代都重新
声明了一个新的 i。这意味着 loop 迭代内部创建的闭包封闭的是每次迭代中的变量,就像
期望的那样。
如果试验同样的代码,只把 var i 放在 for 循环头部,得到的结果就会是 5 而不是 3,因
为在外层作用域中只有一个 i,这个 i 被封闭进去,而不是每个迭代的函数会封闭一个
新的 i。
还可以通过下面更详细一点的代码完成同样的事情:
var funcs = [];
for (var i = 0; i < 5; i++) {
let j = i;
funcs.push( function(){
console.log( j );
} );
}
funcs[3](); // 3
这里我们强制在每个迭代内部创建了一个新的 j,然后闭包的工作方式是一样的。我更喜
欢前面一种形式;这个特殊的额外功能是我为什么支持 for (let .. ) .. 形式的原因。可
能有人认为这种形式太隐式(隐晦),但我认为这已经足够明晰,也足够有用了。
let 放在 for .. in 和 for .. of 循环中也是一样的(参见 2.9 节)。
2.1.2 const 声明
还有一个块作用域声明形式需要了解:const,用于创建常量。
常量到底是什么?它是一个设定了初始值之后就只读的变量。考虑:
{
const a = 2;
console.log( a ); // 2
68 | 第 2 章
图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权