В какой-то степени это логично и скорее нюанс блочной видимости let. Так-то блок для каждой итерации цикла "свой", и значение замыкается "своё". Для var эта область функциональная, и поэтому цикл входит в нее "полностью". Можно представить как
for (let _ = 0; _ < 3; _++) {
const i = _;
setTimeout(() => console.log(i), 1);
}
----------
let i;
for (let _ = 0; _ < 3; _++) {
i = _;
setTimeout(() => console.log(i), 1);
}
В какой-то степени это логично и скорее нюанс блочной видимости let. Так-то блок для каждой итерации цикла "свой", и значение замыкается "своё". Для var эта область функциональная, и поэтому цикл входит в нее "полностью". Можно представить как