Middle+
Cosa succede con il contesto quando si usano closures? Quale sarà il contesto delle funzioni create in un ciclo con var?
sobes.tech AI
Risposta dell'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);
}