Вопрос проверяет умение корректно работать с асинхронным кодом и областями видимости в циклах.
Самый простой способ — использовать let вместо var, так как let создаёт новую переменную для каждой итерации цикла. Также можно использовать IIFE или передавать значение в функцию явно. Эти подходы позволяют каждому асинхронному колбэку работать со “своим” значением. В современном коде предпочтителен let.
Решение всегда сводится к одному: создать отдельную область видимости для каждой итерации.
let (рекомендуемый способ)for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 100);
}
Почему работает:
let имеет блочную область видимости
на каждой итерации создаётся новая переменная i
for (var i = 0; i < 3; i++) {
(function (value) {
setTimeout(() => {
console.log(value);
}, 100);
})(i);
}
Здесь:
значение i копируется в параметр value
каждый колбэк замыкается на своё значение
function logLater(value) {
setTimeout(() => console.log(value), 100);
}
for (var i = 0; i < 3; i++) {
logLater(i);
}
Используй let по умолчанию
var оставляй только для legacy-кода
понимание IIFE важно для чтения старых проектов
Вывод: корректный вывод в асинхронном цикле достигается созданием отдельной области видимости для каждой итерации, чаще всего с помощью let.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию