一些静态语言(如Java)似乎对for循环的第一个参数中定义的变量有非常特殊的规则。它们只能由给定的循环访问,这使得它们的行为非常类似于javascript函数的局部变量和参数。我的意思是这样的:
class ForVariable {
public static void main(String[] args) {
for(int i = 0; i != 0; i++) {}
System.out.println(i); // Throws an Exception
}
}
Javascript的行为并不像那样,这使得嵌套循环非常混乱。我的问题是:通过var关键字在后续循环中声明变量是否有效?换句话说 - 以下哪个例子有效?
for(var i = 0, j; i < 5; i++) {
for(j = 0; j < 10; j++) <do some stuff>;
}
OR
for(var i = 0; i < 5; i++) {
for(var j = 0; j < 10; j++) <do some stuff>;
}
显然,多次声明一个变量是错误的,这会使第二个例子成为禁忌,但考虑到第一个例子就是我知道的大多数语言中循环嵌套的方式,我宁愿犹豫不决宣布获胜者。
答案 0 :(得分:4)
这些都是有效的。 Function scoped vs block scoped。基本上JavaScript中的两个循环都变成:
function a () {
var i, j;
for(i = 0, j; i < 5; i++) {
for(j = 0; j < 10; j++) <do some stuff>;
}
}
因为var
声明是hoisted到顶部
答案 1 :(得分:1)
您不希望使用var
关键字,而是使用函数参数,因为javascript不是块范围的。例如:
[100,200,300].forEach(function (x,i) {
[10,20,30].forEach(function (y,j) {
console.log('loop variables, indices '+[i,j]+' have values: '+[x,y]);
});
})
或
[100,200,300].map(function (x,i) {
return [10,20,30].map(function (y,j) {
return x+y;
});
})
// result: [[110,120,130],[210,220,230],[310,320,330]]
答案 2 :(得分:1)
它不是错误多次声明一个变量。例如,确实没有问题:
var i = 0;
var i = 1;
这是有效的JavaScript。像Closure Compiler这样的好工具会产生警告,因为你通常不打算这样做。
话虽这么说,即使Closure Compiler也不会为你的例子#2生成警告。即使您在技术上重新声明,它也只是JS中的常见惯例。
你的两个例子中的任何一个都是罚款,但第二个例子对解析更为明智。我不会担心它。