重新初始化for循环

时间:2018-10-03 10:55:10

标签: javascript ecmascript-6 scope let

我在这段代码中发现了一些奇怪的行为:

for (let i = 1; i < 2; i++) {
  let i = 10;
  console.log(i);
}

由于声明加倍,我希望它会引发语法错误,但是它可以工作并打印10。 也许有人可以解释?为什么它不是同一环境并执行阴影处理? 谢谢

3 个答案:

答案 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中声明的{}的范围内。这就是为什么这样有效。