Sobes.tech
Middle+

¿Qué sucede con el contexto al usar closures? ¿Cuál será el contexto de las funciones creadas en un ciclo usando var?

sobes.tech AI

Respuesta de la IA

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

Если функции создаются в цикле с использованием 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);
}