Sobes.tech
Back to questions
Middle
4

Задача с замыканием: почему функция всегда выводит 0, а не инкрементированное значение?

Companies where asked
МПФИТ

Answer from AI

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);
}

Таким образом, проблема в том, что замыкание захватывает переменную, а не её значение в момент создания функции.