Witiko
Witiko

Reputation: 3387

Variable definitions in nested for loops?

Some static languages like Java seem to have very special rules for variables defined in the first argument of a for loop. They are accessible only by the given loop, which makes them behave pretty much like javascript functions' local variables and arguments. I mean stuff like this:

class ForVariable {
  public static void main(String[] args) {
    for(int i = 0; i != 0; i++) {}
    System.out.println(i); // Throws an Exception
  }
}

Javascript doesn't behave like that, which makes nesting loops quite a messy business. My question is: Is it valid to declare variables in the subsequent loops via the var keyword? In other words - which of the following examples is valid?

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>;
}

Clearly it is wrong to declare a variable several times, which would make the 2nd example a no-go, but given the fact that the 1st example is the way loops nesting is done in most languages I know, I'm rather hesitant to declare the winner.

Upvotes: 1

Views: 2007

Answers (3)

ninjagecko
ninjagecko

Reputation: 91094

You don't want to be using the var keyword, but rather function arguments, because javascript is not block-scoped. For example:

[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]);
    });
})

or

[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]]

Upvotes: 1

Joe
Joe

Reputation: 82584

Those are both valid. Function scoped vs block scoped. Basically both loops in JavaScript become:

function a () {
    var i, j;
    for(i = 0, j; i < 5; i++) {
      for(j = 0; j < 10; j++) <do some stuff>;
    }
}

because the var declarations are hoisted to the top

Upvotes: 4

Simon Sarris
Simon Sarris

Reputation: 63812

Its not wrong to declare a variable several times. For instance there is really no problem with:

var i = 0;
var i = 1;

That's valid JavaScript. Good tools like the Closure Compiler will generate a warning though because you typically don't intend to do that.

That being said, even the Closure Compiler won't generate a warning for your example #2. It's just common convention in JS even if you are technically re-declaring.

Either of your two examples is fine but the second one is a little more sensible to parse. I wouldn't worry about it either way.

Upvotes: 1

Related Questions