Назад к вопросам
OZON
Middle+
11
Что происходит с контекстом при использовании замыканий? Какой контекст будет у функций, созданных в цикле через var?
Компании, где спрашивали
Ответ от нейросети
sobes.tech 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);
}