Javascript for循环是否隐式创建块?
我正在Node.JS中玩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;
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)语句
不过,请记住,它仍然会发生变化。啊,我知道你在那里做了什么。显然,为了清楚起见,您不希望在实际代码中这样做。有些语言(如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);
}
}
}