为什么const在JavaScript中的一些for循环中起作用?

Kon*_*ten 16 javascript scope const let ecmascript-6

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

for(const i = 0; i < 5; i++) console.log(i);
Run Code Online (Sandbox Code Playgroud)

虽然这样会.

for(let i = 0; i < 5; i++) console.log(i);
Run Code Online (Sandbox Code Playgroud)

但是,我注意到它们在循环通过像这样的对象的属性时工作.

for(let property in thingy) console.log(property);
for(const property in thingy) console.log(property);
Run Code Online (Sandbox Code Playgroud)

我不知道为什么.

Mic*_*ski 19

for (const property in object)因为每次迭代都会得到一个新的变量,它只限于那个迭代.您可以通过在循环内使用闭包来轻松检查:

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

该日志ab,但如果你改变constvar,它记录b了两次.

  • @PhilippeOceangermanique 因为该值在更改之前立即被记录。使用“setTimeout”和“var”,它会在循环完成后运行,因此每个“console.log(property)”都会访问名为“property”的*单个*变量,该变量在循环结束后具有值“b”。对于“let”或“const”,有多个称为“property”的不同变量,其中每个变量都位于单独的作用域中,并且每次迭代都有一个作用域。 (2认同)

Jus*_*ner 16

在您的第一个示例中,i通过修改i++.A const无法修改,因此您会收到错误消息.

在第二个示例中,property为每个迭代重新定义(每个实例都超出范围,并创建一个新的实例而不是仅重新分配给同一个变量)for.由于您实际上是在重新定义而不是修改值,因此const工作正常.

  • @KonradViltersten - 除了 `let` 允许你在 `for` 循环中修改 `property` 而 `const` 不应该。 (2认同)