为什么 const 在 JavaScript 中的某些 for 循环中有效?

Why does const work in some for-loops in JavaScript?

知道 为什么 const 在 for 循环中不起作用。我们需要创建一个新范围并将值复制到其中。所以这不会飞。

for(const i = 0; i < 5; i++) console.log(i);

而这会。

for(let i = 0; i < 5; i++) console.log(i);

但是,我注意到在像这样循环遍历对象的属性时,它们都可以工作。

for(let property in thingy) console.log(property);
for(const property in thingy) console.log(property);

我不知道为什么。

在您的第一个示例中,i 是通过 i++ 修改的。 Aconst无法修改,所以报错

在第二个示例中,property 为 [=14] 的每次迭代重新定义(每个实例超出范围并创建一个新实例,而不是仅仅重新分配给同一个变量) =] 循环。由于您实际上是在重新定义而不是修改值,因此 const 工作得很好。

for (const property in object) 之所以有效,是因为每次迭代都会获得一个新变量,该变量的范围仅限于该迭代。您可以通过在循环内使用闭包轻松检查:

for (const property in {a: 1, b: 2}) {
  setTimeout(() => {
    console.log(property);
  }, 100);
}

这会记录 ab,但是如果您将 const 更改为 var,它会记录 b 两次。