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