Ámbito de variables en JavaScript: var, let, const y funciones
¡Hola a todos! Acabo de empezar a aprender JavaScript y no puedo entender el ámbito de las variables. Escribo código simple, pero los resultados siempre me sorprenden.
Aquí hay un ejemplo:
```javascript
var x = 10;
function test() {
var x = 20;
if (true) {
var x = 30;
console.log(x); // muestra 30
}
console.log(x); // muestra 30, ¡no 20!
}
test();
console.log(x); // muestra 10
```
¿Por qué dentro de la función `test()` la variable `x` cambia, aunque la declaré con `var` dentro del bloque `if`? Pensaba que `var` estaba limitado a la función, pero aquí se comporta de manera extraña. También he oído hablar de `let` y `const`, pero no entiendo en qué se diferencian.
Otro ejemplo con closures:
```javascript
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // muestra 3, 3, 3
}, 100);
}
```
¿Por qué las tres llamadas muestran 3, y no 0, 1, 2? Esperaba que cada llamada a setTimeout recordara su propio valor de i. Por favor, explíquenme cómo funciona.