为什么在循环体内声明的变量不被视为重新声明?
Why are variables declared inside a loop body not considered a redeclaration?
为什么在循环内声明的 const
或 let
变量不会引发重新声明错误?
示例:
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(let
、const
、class
) 在循环体内。
如果你在z
外循环块声明,那么只有一个z
,你是对的,重新分配会失败:
const z = 'dwan0';
for (let i = 1; i<5; i++) {
z = 'dwan' + i; // <=== Fails here
setTimeout(() => {
console.log(z);
}, i * 200);
}
为什么在循环内声明的 const
或 let
变量不会引发重新声明错误?
示例:
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(let
、const
、class
) 在循环体内。
如果你在z
外循环块声明,那么只有一个z
,你是对的,重新分配会失败:
const z = 'dwan0';
for (let i = 1; i<5; i++) {
z = 'dwan' + i; // <=== Fails here
setTimeout(() => {
console.log(z);
}, i * 200);
}