为什么在循环体内声明的变量不被视为重新声明?

Why are variables declared inside a loop body not considered a redeclaration?

为什么在循环内声明的 constlet 变量不会引发重新声明错误?

示例:

for (let i = 1; i < 5; ++i){
  const z = "dwan";
}

在第二次迭代中,即当 i === 2 时,z 将在同一范围内再次重新分配,因此这应该会引发错误,但不会。

我哪里错了?

因为不同z,不是同一个。如果您编写一个关闭它的函数,您会发现它是不同的:

for (let i = 1; i<5; i++) {
    const z = 'dwan' + i;
    setTimeout(() => {
        console.log(z);
    }, i * 200);
}

每个循环迭代都有自己的 执行上下文 ,其中包含用现代构造声明的任何 variables/constants(letconstclass) 在循环体内。

如果你在z循环块声明,那么只有一个z,你是对的,重新分配会失败:

const z = 'dwan0';
for (let i = 1; i<5; i++) {
    z = 'dwan' + i; // <=== Fails here
    setTimeout(() => {
        console.log(z);
    }, i * 200);
}