Javascript hoisting

En ES5, las variables tienen dos ámbitos, global y de función.

Si no se usa var, el ámbito por default es global.

Si se usa var, el ámbito es de función.

Si se usa var dentro de un bloque, no importa, el ámbito sigue siendo de la función. Es como si todas las declaraciones var fueran escritas al inicio de la función y no dentro de los bloques. A eso se llama hoisting.

De ese modo:

var f = function(){
if (true) {var v1= 1;} 
if(true) {var v2 =2;}
return v1+v2;
}
console.log(f());

devuelve 3 porque es equivalente a:

var f = function(){
var v1, v2;
if (true) {v1= 1;} 
if(true) {v2 =2;}
return v1+v2;
}
console.log(f());

Así que es conveniente hacer el ámbito explícito, como en el ejemplo reescrito. Principalmente si se trabaja en grupo, para evitar confusiones.

En ES6, sí se va a considerar el ámbito por bloques.

Referencias