let in for循环的重新初始化

Re-init of let in for-loop

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

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

我预计它会抛出语法错误,因为双重声明,但它有效并打印了 10。 也许,有人可以解释一下吗?为什么它不是相同的环境并执行阴影? 谢谢

您可以在函数范围内重新分配和覆盖 let 变量。当 let 变量在同一范围内重新声明时,您将遇到错误,告诉您 let i 已经被定义。 This post 涵盖得很好。

使用 let 变量的主要原因之一是当您使用受限内存时,因为 let 变量是严格的。但是,您可以在函数范围内使用变量,因为变量的更改仅在该范围内。您在问题中提到的语法错误仅在同一范围内重新声明变量时才会发生。

您不能在相同范围内重新声明同一个变量。

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 循环,初始化阶段是 主体引入的新作用域之前,因此您可以重新声明其中的变量。

在相同的范围内,您不能重新声明某些变量。 范围由 curly brace/{} 定义。在 {} 中你不能重新声明一些变量。 试试这个

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

这会引发错误。因为这里重新声明了i。 混淆是关于循环控制变量i。控制变量引用了循环范围。控制变量 i 不在 {} 内声明的 i 范围内。这就是为什么这是有效的。