为什么 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);
}
这会记录 a
和 b
,但是如果您将 const
更改为 var
,它会记录 b
两次。
我 知道 为什么 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);
}
这会记录 a
和 b
,但是如果您将 const
更改为 var
,它会记录 b
两次。