Sobes.tech
Middle+

Wat gebeurt er met de context bij het gebruik van closures? Wat wordt de context van functies die in een lus met var worden gemaakt?

sobes.tech AI

Antwoord van AI

При использовании замыканий функция «запоминает» контекст, в котором была создана, включая все переменные из внешней области видимости.

Если функции создаются в цикле с использованием var, то все они будут ссылаться на одну и ту же переменную, объявленную через var вне тела функции. В итоге при вызове таких функций они будут использовать текущее значение этой переменной, которое после завершения цикла будет равно последнему значению.

Пример:

var funcs = [];
for (var i = 0; i < 3; i++) {
  funcs.push(function() { console.log(i); });
}
funcs[0](); // 3
funcs[1](); // 3
funcs[2](); // 3

Чтобы получить ожидаемое поведение, используют let (который создаёт новую переменную в каждой итерации) или создают дополнительное замыкание:

for (let i = 0; i < 3; i++) {
  funcs.push(function() { console.log(i); });
}
// Теперь funcs[0]() выведет 0, funcs[1]() — 1, funcs[2]() — 2

Или через замыкание:

for (var i = 0; i < 3; i++) {
  (function(j) {
    funcs.push(function() { console.log(j); });
  })(i);
}