El alcance de las variables puede ser confuso para muchos desarrolladores principiantes, y no tan principiantes.
La razón es porque JavaScript se parece un poco a un lenguaje de la familia de C.
#include
int main() {
int x = 1;
printf("%d, ", x); // 1
if (1) {
int x = 2;
printf("%d, ", x); // 2
}
printf("%d\n", x); // 1
}
El resultado del programa sería 1, 2, 1, ya que C, así como el resto de la familia de C, tienen
alcance de bloque
Esto no es el caso en JavaScript:
var x = 1;
console.log(x); // 1
if (true) {
var x = 2;
console.log(x); // 2
}
console.log(x); // 2
En éste caso, el resultado es 1, 2, 2. Esto es porque
JavaScript sólo tiene alcance de función
Para muchos programadores acostumbrados a lenguajes como C, C++, C# o Java, ésto no es esperado. Afortunadamente tenemos la flexibilidad de las funciones, y hay un
workaround(solución?). Si debes crear bloques temporales dentro de una función, puedes hacer lo siguiente:
function foo() {
var x = 1;
if (x) {
(function () {
var x = 2;
// ...
}());
}
// x sigue siendo 1.
}