循环内的常量声明
ES6
规范没有明确禁止在循环中使用const
声明,然而它会根据循环方式的不同而有不同行为。在常规的for
循环中,你可以在初始化时使用const
,但循环会在你试图改变该变量 的值时抛出错误。例如:
var funcs = [];
//在一次迭代后抛出错误
for (const i = 0; i < 10; i++){
funcs.push(function(){
console.log(i);
});
}
在此代码中,i
被声明为一个常量。循环的第一次迭代成功执行,此时i
的值为0
。在i++
执行时,一个错误会被抛出,因为该语句试图更改常量的值。因此,在循环中你只能使用const
来声明一个不会被更改的变量。
而另一方面,const
变量在for-in
或for-of
循环中使用时,与let
变量效果相同。因此下面代码不会导致出错:
var funcs = [];
object = {
a:true,
b:true,
c:true
}
//不会导致错误
for (const key in object){
funcs.push(function(){
console.log(key);
});
}
funcs.forEach(function(){
func(); // 依次输出 “a”、“b”、“c”
})
这段代码与“循环内的let
声明”小节的第二个例子几乎完全一样,唯一的区别是key
的值在 循环内不能被更改。const
能够在for-in
与for-of
循环内工作,是因为循环为每次迭代创建了一个新的变量绑定,而不是试图去修改已绑定的变量的值(就像使用了for
而不是for-in
的上个例子那样)。