user1032531
user1032531

Reputation: 26281

Is it bad to duplicate declaring JavaScript variables?

Is it bad to duplicate declaring JavaScript variables? For instance, given the below code, is one approach better than the other? If so, please explain why. Thank you

function func1() {
    for (var i = 0; i < 100; i++) {
        var myVar=123;
    }
}

OR

function func2() {
    var myVar;
    for (var i = 0; i < 100; i++) {
        myVar=123;
    }
}

Upvotes: 1

Views: 95

Answers (3)

KayakDave
KayakDave

Reputation: 24676

These are functionally identical.

Javascript takes two passes through code. During the first pass variables are set up (amongst other things).

In your first version, during the first pass of the interpreter it will see that you declare a variable myVar and it will hoist the definition of the variable to the top of the scope (which is the function in this case because loops don't have their own scope in javascript).

Thus in javascript's second pass, when the code is executed (interpreted), everything will be identical.

So, in javascript all variables act as if they were declared at the top of the scope, regardless of where, or if, you declare them.

One of the potentially confusing things about javascript is that it has c like syntax and yet has some significant differences from other c-like languages. And this is one of those differences.

Upvotes: 2

Jochem Kuijpers
Jochem Kuijpers

Reputation: 1797

It's generally considered better to declare variables at the beginning of a piece of code (or function), than at random places. One exception being the for-loop.

function func2() {
    var myVar; // try to declare all variables here
    for (var i = 0; i < 100; i++) { // except for the for-loop variable
        myVar = 123;
    }
}

Why I'd do this: because other languages work this way as well, so it makes it easier to read. For JavaScript specificity it doesn't really matter since scope works weird in JavaScript.

Main argument for this way of writing the function: readability.

Upvotes: 0

kojiro
kojiro

Reputation: 77137

Actually, these code samples are equivalent and will probably compile to the same bytecode.

function func1() {
    for (var i = 0; i < 100; i++) {
        var myVar=123;
    }
}

AND

function func2() {
    var myVar;
    for (var i = 0; i < 100; i++) {
        myVar=123;
    }
}

This is because of hoisting, and in fact you could also do:

function func3() {
  var i, myVar;
  for (i = 0; i < 100; i++) {
    myVar=123;
  }
}

Although you might save time with function func4() { var myVar=123; } ;)

Upvotes: 4

Related Questions