【发布时间】:2018-09-09 10:11:06
【问题描述】:
所以我注意到我必须在for 循环中使用let,而不能使用const。但是,我发现我可以在for-in 和for-of 构造中使用const(代码如下)。直觉上我可以合理地解释这是因为 for 循环的实现方式不同/更原始,而其他构造去糖化到 for 循环中,其中迭代变量被分配在 for 循环的顶部。
// Doesn't work
for (const i = 0; i < 3; i++) {
console.log(i);
}
// Works
for (let i = 0; i < 3; i++) {
console.log(i);
}
// Works
const object2 = ['a', 'b', 'c'];
for (const v of object2) {
console.log(v);
}
// Works
const object3 = {
a: 'a',
b: 'b',
c: 'c',
};
for (const v in object3) {
console.log(v);
}
我在 Mozilla MDN 上唯一能找到的就是 for 循环页面:
此表达式可以选择使用 var 声明新变量 关键词。这些变量不是循环本地的,即它们在 for 循环所在的范围相同。这个表达式的结果是 丢弃。
这似乎也是错误的,因为如果我们将let 用于i,那么i 在for 循环之后不再在范围内(这与其他语言一致)
for (let i = 0; i < 3; i++) {
console.log(i);
}
// Doesn't work as expected
console.log(i);
我的问题是这种行为是否是预期的并在规范中的某处定义? MDN 对此并没有多说。
【问题讨论】:
-
关于“...if we use a let for i...”,这与使用 var 而不是 的 MDN 代码不同让.
-
@robG 啊,真的,那句话的第二句话是指第一句话。我的立场是正确的。
标签: javascript for-loop ecmascript-6 scope for-in-loop