Esto no es un problema de programación, es solo una pregunta sobre un tema con alcances en JavaScript que me gustaría entender mejor.
El siguiente código recorre una serie de elementos de clase y hace clic en ellos a intervalos aleatorios de entre 250 y 750 ms. Un código muy básico pero lo curioso (y lo más difícil de entender para mí es el uso de la declaración let para la variable i en el bucle for.
var x2 = document.querySelectorAll(".someClass"); for (let i=0; i < 35; i++){ setTimeout(function(){ x2[i].click(); }, i*(Math.random()*(750-250) + 250)); } Sin let , es decir, si hubiera usado var en lugar de let (y esto en la declaración del ciclo, fuera del ciclo o globalmente), el elemento x[2] no estaría definido. Si creo un nuevo alcance dentro del ciclo, este código no funcionará como se esperaba. En lugar de hacer clic en el elemento x2[i] con un retraso aleatorio 35 veces, primero esperaría el retraso aleatorio y luego haría clic en todos los elementos a la vez.
Pero, hasta donde yo sé, la declaración let solo significa que la variable i tendría un alcance limitado para el ciclo for . ¿Por qué usar var lo haría indefinido? Y, si envuelvo la llamada en otra función anónima para crear un alcance, lo cual es contrario a la intuición, el resultado sería un comportamiento completamente defectuoso. ¿Cómo es posible todo esto? ¿Es esa una bandera de diseño en JavaScript o es un hecho común en muchos otros lenguajes de programación?
¿Me estoy perdiendo algo?