Javascript for循环是否隐式创建块?

Javascript for循环是否隐式创建块?,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在Node.JS中玩let(需要标志--harmony和--use strict)。据我所知,let语句允许块范围的声明。考虑以下事项: let a; for(let i = 0; i < 3; i += 1) { console.log(i); } 基于最近(2013年5月14日):是 您可以在第12.6.3节中找到以下内容,该节规定,当for语句包含词汇声明(let或const)时,将创建一个附加环境(范围): 迭代语句:for(LexicalDeclarationNoIn;

我正在Node.JS中玩
let
(需要标志
--harmony
--use strict
)。据我所知,
let
语句允许块范围的声明。考虑以下事项:

let a;
for(let i = 0; i < 3; i += 1) {
  console.log(i);
}
基于最近(2013年5月14日):是

您可以在第12.6.3节中找到以下内容,该节规定,当
for
语句包含词汇声明(
let
const
)时,将创建一个附加环境(范围):

迭代语句:for(LexicalDeclarationNoIn;Expressionopt;Expressionopt)语句

  • 让oldEnv成为正在运行的执行上下文的词典环境
  • 让loopEnv成为调用NewDeclarativeEnvironment并将oldEnv作为参数传递的结果。

  • 不过,请记住,它仍然会发生变化。

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