【问题标题】:Do for loops implicitly create a block?for 循环是否隐式创建一个块?
【发布时间】:2013-06-27 20:51:14
【问题描述】:

我在 Node.JS 中使用 let(需要标志 --harmony--use-strict)。据我了解,let 语句允许块范围的声明。考虑以下几点:

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

涉及多少块作用域? i 位于哪个块范围内?我是否正确地认为,为了使这个示例起作用,涉及 三个 块作用域,其中一个作用域由 for 循环隐式创建,如下所示?

{ // block #1
  let a;
  { // block #2 (contains `i`)
    let i;
    for(i = 0; i < 3; i += 1) { // block #3
      console.log(i);
    }
  }
}

【问题讨论】:

  • 啊,我知道你在那里做了什么。显然,为了清楚起见,您不希望在实际代码中这样做。像 C# 这样的一些语言实际上会阻止您在内部范围内重用变量名(以确保清晰),即使它可以工作。
  • 如果你使用 let,你会得到块作用域,至少在循环中。
  • 似乎是这样,因为您可以在函数中声明许多具有相同名称的变量,例如,它对let有效,但对var无效。
  • 是的,你是对的。 for 语句的头部具有包含整个语句的自己的范围,因此 i 不是每次迭代的范围。
  • ...这很容易在外部使用a=[] 进行测试,然后在内部使用a[i]=function(){console.log(i);};。在循环之后调用生成的函数,然后就可以了。

标签: javascript ecmascript-6


【解决方案1】:

基于最近(2013 年 5 月 14 日)draft of ES6:是的。

您可以在第 12.6.3 节下找到以下内容,其中指出当 for 语句包含 LexicalDeclaration (@ 987654323@或const):

IterationStatement : for (LexicalDeclarationNoIn ; 表达式opt ; 表达式opt ) 声明

  1. oldEnv 为正在运行的执行上下文的 LexicalEnvironment。
  2. loopEnv 成为调用 NewDeclarativeEnvironment 并传递 oldEnv 作为参数的结果。
  3. ...

但请记住,它仍有可能发生变化。

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多