在 JavaScript for 循环中设置变量

Nae*_* M. 2 javascript var let

我检查了有关同一问题的问题和答案,但没有一个回答我的问题,所以请不要丢弃我的问题。

当“i”被声明为 let 变量时,对于每次迭代,JS 都会创建一个新的“i”绑定,因此 SetTimout 的每个函数在其闭包内都有自己的“i”(与“i”的情况相反)被声明为 var 变量,其中所有 SetTimout 函数在其闭包中共​​享相同的绑定)。问题是:如果 JS 在使用 let 时在 for 循环的每次迭代中创建一个新的“i”绑定,那么增量值如何传输到 i 的新绑定?

i 的新绑定如何用 i 的当前值实例化?

我们是否真的在不同范围内有两个具有不同值的 i 绑定(如果是),这些范围是什么?

提前致谢

function a() {

    for (let i = 0; i < 3; i++) {
        setTimeout(function () { console.log(i) }, i * 1000);
    }
}

a();
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 5

如果 JS 在使用 let 时在 for 循环的每次迭代中创建一个新的“i”绑定,那么增量值如何传输到 i 的新绑定?

在迭代结束时,值从前一个环境记录复制到下一个环境记录。

我们是否真的在不同范围内有两个具有不同值的 i 绑定(如果是),这些范围是什么?

我想在这里介绍术语“环境记录”,该术语是规范用来描述绑定值的“事物”的术语的“事物”的术语。有多个环境记录(每次迭代一个),所有这些记录都具有相同的范围(可以在循环体内访问这些值),并且可能有不同的生命周期和值。

您将在ES262,13.7.4.9 运行时语义:CreatePerIterationEnvironment中找到所有这些内容