gpt4 book ai didi

javascript - ES6中for循环的作用范围是什么?

转载 作者:可可西里 更新时间:2023-11-01 02:44:18 26 4
gpt4 key购买 nike

JavaScript 中 for 循环中 let 的作用范围究竟是什么?

for (let i = 0; i < 3; i++) {
let i = 4;
console.log(i);
}
console.log(i);

外部console.log 抛出错误:

"Uncaught Reference Error: i is not defined"

证明i在block action作用域中,但是,为什么for循环中定义的i没有抛出任何重复定义错误?

最佳答案

一个for的正文循环(带有 let 变量声明)有两个范围(或 LexicalEnvironments):一个范围是迭代环境,它包含用 let 声明的变量在for循环声明,内部作用域包含在 for 循环体内声明的变量(在 { 之后)。这在规范中有描述,起始于 13.7.4.7 Runtime Semantics: LabelledEvaluation

IterationStatement : for ( LexicalDeclaration Expression; Expression ) Statement

(这就是用 for 声明变量的 let 循环。)

评估以上内容最终会让您:

  1. Let bodyResult be ForBodyEvaluation(the first Expression, the second Expression, Statement, perIterationLets, labelSet).

请注意,“语句”可以是一个 block (可以以{ 开始并以} 结束,就像大多数for 循环体一样)——这非常重要,因为a block 创建另一个词法环境。

13.7.4.8 Runtime Semantics: ForBodyEvaluation说:

  1. 执行 ? CreatePerIterationEnvironment(perIterationBindings)。

  2. 重复,

    令 result 为评估 stmt 的结果。

    ...

    履行 ? CreatePerIterationEnvironment(perIterationBindings)。

哪里CreatePerIterationEnvironment creates an environment包含用 let 声明的变量在for循环声明:

g.对于 perIterationBindings 的每个元素 bn,做

我。履行 ! thisIterationEnvRec.CreateMutableBinding(bn, false).

二。让 lastValue 是? lastIterationEnvRec.GetBindingValue(bn, true).

iii.执行此 IterationEnvRec.InitializeBinding(bn, lastValue)。

因此,有两个作用域:一个由 CreatePerIterationEnvironment 创建, 和一个由 stmt 的 block 创建的是。

for (let i = 0; i < 3; i++) {
let foo = 'f';
}

在这里,i包含在外部迭代环境中,并且foo包含在内部 block 中,这是一个不同的环境。如果您将这两个变量名称设为相同,则不会抛出错误,因为 let <variableName>在 block 内创建一个变量范围为该 block ,并且不会尝试在迭代环境中覆盖具有相同名称的变量。

关于javascript - ES6中for循环的作用范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com