嵌套for循环中的变量定义?

时间:2011-10-11 19:09:39

标签: javascript loops for-loop nested-loops

一些静态语言(如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>;
}

显然,多次声明一个变量是错误的,这会使第二个例子成为禁忌,但考虑到第一个例子就是我知道的大多数语言中循环嵌套的方式,我宁愿犹豫不决宣布获胜者。

3 个答案:

答案 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中的常见惯例。

你的两个例子中的任何一个都是罚款,但第二个例子对解析更为明智。我不会担心它。