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