En esta pregunta de entrevista clásica, se crea una nueva i para cada iteración. Esta nueva i tiene un cierre con la función en setTimeout y produce la salida 0 1 2 3 4 . No entiendo por qué se inicializa una nueva i cuando se declara con let pero no cuando se declara con var . Eso debería ser imposible ya let no permite que se cree otra variable con el mismo nombre. Además, dado que los cierres se crean cuando se define una función, ¿no debería la función anónima en setTimeout tener un cierre alrededor de la i original igual a 0 en el alcance del bloque? Gracias.
for (let i = 0; i < 5; i++) { setTimeout(function () { console.log(i); }, 1000); } //Output: //0 //1 //2 //3 //4