1

通常我会let i在以下前两种情况下使用 a :

> for (const i in ["red", "green", "blue"]) { console.log(i) }
0
1
2

> for (const i of ["red", "green", "blue"]) { console.log(i) }
red
green
blue

> for (const i = 0; i < 10; i++) { console.log(i) }
0
TypeError: Assignment to constant variable.

但是Mozilla 文档声明 aconst可以使用。那么i区块结束后就不复存在了{ console.log(i) }?如果是上面的第三种情况,那不是真的吗?

这是一个微妙的规则吗?循环变量forfor ( in )for ( of )loop在块之后就不存在了,但是对于for (;;)循环,它还存在吗?它有点微妙——它在任何 ES6 规范中吗?

4

2 回答 2

2

每种情况下的变量在循环后都不再存在。如果您使用let而不是const.

for (let i in ["red", "green", "blue"]) { console.log(i) }
for (let i of ["red", "green", "blue"]) { console.log(i) }
for (let i = 0; i < 10; i++) { console.log(i) }
console.log(i); // error, because `i` is local

但是,您不能++在常量上使用,这会导致您的错误。for..offor..in构造中的常量或变量在每个循环中重新创建;但你不能用for.

但是,如果您不尝试修改常量,它会再次按预期工作:

for (const i = [0]; i[0] < 10; i[0]++) { console.log(i[0]) }
console.log(i) // error, because `i` is local

于 2019-12-19T08:55:10.177 回答
-2

如果您需要限制循环变量的范围,只需用另一个块包围循环并使用let.

{
    for (let i in ["red", "green", "blue"]) {console.log(i);}
}
console.log(i);

这样最后一个console.log会抛出引用错误,因为它没有在其范围内定义

于 2019-12-19T08:59:52.880 回答