Avatar ·

Á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.