Вопрос проверяет понимание замыканий и области видимости переменных в JavaScript, что важно для написания корректного асинхронного кода.
Когда вы создаете функции внутри цикла и используете переменную цикла (например, i), эти функции запоминают не значение переменной на момент создания, а ссылку на саму переменную. Если переменная объявлена через var, она имеет функциональную область видимости, и все функции видят одно и то же значение после завершения цикла.
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // Выведет 3, 3, 3
}, 100);
}Здесь все три функции выполняются после завершения цикла, когда i уже равно 3.
for (let i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i); // Выведет 0, 1, 2
}, 100);
}let создает новую переменную для каждой итерации, поэтому каждая функция получает свое значение.
for (var i = 0; i < 3; i++) {
(function(j) {
setTimeout(function() {
console.log(j); // Выведет 0, 1, 2
}, 100);
})(i);
}Немедленно вызываемая функция создает новую область видимости, копируя текущее значение i в параметр j.
Вывод: Используйте let для переменных цикла, чтобы избежать неожиданного поведения с замыканиями. Если нужно поддерживать старые браузеры, применяйте паттерн с немедленно вызываемой функцией.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию