【问题标题】: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。
也许,有人可以解释一下吗?为什么它不是同一个环境并执行阴影?
谢谢
【问题讨论】:
标签:
javascript
ecmascript-6
scope
let
【解决方案1】:
您可以在函数范围内重新分配和覆盖 let 变量。当 let 变量在同一个作用域内重新声明时,你会遇到错误,告诉你 let i 已经被定义了。 This post 覆盖得很好。
使用 let 变量的主要原因之一是当您使用受限内存时,因为 let 变量是严格的。但是,您可以在函数范围内使用变量,因为变量的更改仅在该范围内。您在问题中提到的语法错误仅在变量在同一范围内重新声明时发生。
【解决方案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 循环,初始化阶段是在主体引入的新范围之前,因此您可以在内部重新声明变量。