var
alone does not perform an assignment. It only flags that when you use the variable name throughout the scope in which the var
occurs, you are talking about a local variable and not global (the controversial default). The var
is spotted when the function is parsed and holds throughout that scope, so where you put it is irrelevant:
var a= 0;
function foo() {
a= 1;
return a;
var a;
}
var b= foo();
alert('global a='+a+', local a='+b);
Results in global a= 0, local a= 1
: even though the var
statement is never reached in the course of execution of foo()
, it is still effective in making a
a local variable.
So declaring var x
a second time in the same scope is completely redundant. However you might sometimes still do it, typically when you re-use a local variable name for a second independent use within the same function. Most commonly:
for (var i= 0; i<onething.length; i++) {
...do some trivial loop...
}
for (var i= 0; i<anotherthing.length; i++) {
...do another trivial loop...
}
Whilst you could certainly omit the second var
, and tools like jslint
would demand you do so, it might not actually be a good idea.
Imagine you later change or remove the first loop so that it no longer declares i
to be var
. Now the remaining second loop suddenly changes meaning from a local to a global variable. If you fail to notice when updating the first loop that the second loop has a hidden dependency on it (and you might very well fail to notice that given how the eyes elide the pattern for(...=0 ; ...<...; ...++)
into “oh, that's just a standard iterator”), you've got a subtle and annoying-to-debug problem.