我在这段代码中发现了一些奇怪的行为:
for (let i = 1; i < 2; i++) {
let i = 10;
console.log(i);
}
由于声明加倍,我希望它会引发语法错误,但是它可以工作并打印10。 也许有人可以解释?为什么它不是同一环境并执行阴影处理? 谢谢
答案 0 :(得分:2)
您可以在函数范围内重新分配和覆盖let变量。在相同的作用域中重新声明let变量时,您会遇到该错误,并告诉您已经定义了let我。 This post涵盖得很好。
使用let变量的主要原因之一是在使用受限内存时,因为let变量很严格。但是,您可以在函数作用域内使用变量,因为变量的更改仅在该作用域内。仅当在同一作用域中重新声明该变量时,才会发生您在问题中所指的语法错误。
答案 1 :(得分:0)
您不能在相同范围内重新声明相同的变量。
let scope = "declaration one";
let scope = "declaration two"; //error
但是,每个作用域可以有自己的变量声明,内部作用域可以覆盖父作用域,但只能在作用域持续时临时覆盖它。
let scope = "outer scope";
if (true) {
let scope = "inside if scope";
console.log(scope);
}
console.log(scope);
{
let scope = "inside block scope";
console.log(scope);
}
console.log(scope);
因此,通过for
循环,初始化阶段是在正文引入的新作用域之前 ,因此您可以在内部重新声明变量。
答案 2 :(得分:0)
在相同范围内,不允许您重新声明某些变量。
范围由curly brace/{}
定义。在{}
中,您无法重新声明某些变量。
试试这个
for (let i = 1; i < 2; i++) {
let i = 10;
let i = 20;
console.log(i);
}
这将引发错误。因为在这里重新声明了i
。
混乱之处在于循环控制变量i
。控制变量引用了循环范围。控制变量i
不在i
中声明的{}
的范围内。这就是为什么这样有效。