【发布时间】: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);};。在循环之后调用生成的函数,然后就可以了。