Вопрос проверяет понимание блочной области видимости и работы замыканий в циклах.
let в цикле создает новую переменную на каждую итерацию. Поэтому каждое замыкание “запоминает” свое значение. В отличие от var, где используется одна общая переменная на весь цикл, let предотвращает типичную ошибку с одинаковыми значениями. Это поведение заложено в спецификацию языка.
let в циклеКогда используется let:
Каждая итерация цикла имеет свою область видимости
Переменная пересоздается заново
Замыкание захватывает уникальное значение
letfor (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 0);
}
Результат:
0
1
2
varfor (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 0);
}
Результат:
3
3
3
var имеет одну общую переменную
К моменту выполнения setTimeout цикл уже завершился
let создает новый binding на каждую итерацию
let делает код безопаснее
не нужны IIFE или дополнительные обертки
поведение интуитивно ожидаемое
Разные значения при let — это не “магия”, а результат блочной области видимости и корректной работы замыканий.