Alcance

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.
}
		
Código