for(var i = 0; i < 5; i++){ setTimeout(() => console.log(i) } for(let i = 0; i < 5; i++){ setTimeout(() => console.log(i) }¿Por qué el bucle con let devuelve 0,1,2,3,4 pero el bucle con var devuelve 5,5,5,5,5?
Esto se debe a la elevación. Declarar una variable con var en su ciclo for no limita su alcance solo a ese bloque de código como lo haría con let. Dado que su existencia se extiende más allá del bucle for, cuando la devolución de llamada setTimeout() evalúa el valor, obtiene el último valor en el que se configuró. (se establece en 5, por lo que el ciclo for se detiene)
for (var val = 0; val < 5; val++) { setTimeout(() => console.log(i) } if (val === 5) { console.log('I can still see the value'); }Puede ver el mismo comportamiento al usar let si ya ha declarado la variable antes de usarla en su ciclo for.
let i; for (i = 0; i < 5; i++) { setTimeout(() => console.log(i) }Ahora se comportaría de la misma manera que lo hizo el ciclo var for.