【问题标题】:Re-init of let in for-loop在 for 循环中重新初始化 let
【发布时间】:2019-03-08 14:14:28
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以在函数范围内重新分配和覆盖 let 变量。当 let 变量在全局范围内重新声明时,您会遇到错误,告诉您 let i 已经定义。这篇文章:stackoverflow.com/questions/762011/… 很好地涵盖了它。
  • @Martin,我会检查帖子,谢谢!

标签: javascript ecmascript-6 scope let


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的解释,马丁!
  • 没问题@IlyaS。 :)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    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 循环,初始化阶段是主体引入的新范围之前,因此您可以在内部重新声明变量。

    【讨论】:

    • 谢谢!我在你的最后一段中发现了我的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多