为什么常量在JavaScript中的某些for循环中起作用?

为什么常量在JavaScript中的某些for循环中起作用?,javascript,scope,ecmascript-6,constants,let,Javascript,Scope,Ecmascript 6,Constants,Let,我确实知道const在for循环中不起作用的原因。我们需要创建一个新的作用域,并将一个值复制到该作用域中。所以这不会飞 for(const i = 0; i < 5; i++) console.log(i); 我不知道为什么。在您的第一个示例中,I是通过I++修改的。const无法修改,因此会出现错误 在第二个示例中,为for循环的每个迭代(每个实例都不在范围内,并且创建了一个新实例,而不仅仅是重新分配给同一个变量)重新定义了属性。因为您实际上是在重新定义而不是修改值,const工作得很

确实知道
const
在for循环中不起作用的原因。我们需要创建一个新的作用域,并将一个值复制到该作用域中。所以这不会飞

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

我不知道为什么。

在您的第一个示例中,
I
是通过
I++
修改的。
const
无法修改,因此会出现错误

在第二个示例中,为
for
循环的每个迭代(每个实例都不在范围内,并且创建了一个新实例,而不仅仅是重新分配给同一个变量)重新定义了
属性。因为您实际上是在重新定义而不是修改值,
const
工作得很好。

for(object中的const属性)
工作得很好,因为每次迭代都会得到一个新变量,该变量的作用域仅限于该迭代。通过在循环中使用闭包,可以轻松检查:

for(在{a:1,b:2}中的常量属性){
设置超时(()=>{
console.log(属性);
}, 100);

}因此,基本上,在这种特殊情况下,
const
let
之间没有区别,对吗?@KonradViltersten-除了
let
允许您修改
循环的
内的
属性,而
const
不应该。哦,对了!因此,实际上这里最好使用
const
。我永远不想/不需要改变财产名称的值。酷!正确的。但是当谈到
let
vs
const
(而不是
var
)时,这里没有区别,对吗?@KonradViltersten在这种情况下没有区别。但是如果没有setTimeout,这对var有效!!:for(在{a:1,b:2}中的var属性){console.log(属性);};结果是“a”“b”?@PhilippeOceangermanique,因为该值在更改之前立即被记录。使用
setTimeout
var
在循环完成后运行,因此每个
console.log(property)
在循环完成后访问名为
property
的单个变量,该变量的值为
b
。对于
let
const
有多个不同的变量称为
property
,其中每个变量都在单独的范围内,每个迭代都有一个范围。
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);