Вопрос такой:
«Один из ваших коллег написал следующую процедуру кода, но она работает не так, как она ожидала. Вы можете объяснить, почему? Как бы вы исправили код, чтобы он давал результат, которого ожидал ваш коллега?»
var output = [];
for (var i = 0; i < 5; i++) {
output[i] = function () {
console.info(i);
}
}
output[0](); // logs 5, not the expected 0
output[1](); // logs 5, not the expected 1
output[2](); // logs 5, not the expected 2
output[3](); // logs 5, not the expected 3
output[4](); // logs 5, not the expected 4
Просматривая эту главу, я обнаружил ошибку в предыдущем примере, которую было достаточно легко заметить. Поэтому меня беспокоит анализ упражнения.
Я понимаю, что замыкания - это функции, которые могут обращаться к родительским переменным. Вместо того, чтобы решать эту проблему за меня, я хотел знать, указывает ли мне сообщество в правильном направлении для решения этой проблемы.
Я провел исследование по этой теме, и я прошел еще 2 руководства по закрытию, я просто не понимаю этот вопрос. Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Область видимости переменной, объявленной с помощью var, - это ее текущий контекст выполнения, который является либо включающей функцией, либо, для переменных, объявленных вне любой функции, глобальным. ->Подробнее читайте здесь
Таким образом, в основном каждое выполнение будет использовать последнее присвоенное значение i.
У вас есть два варианта
var output = [];
for (var i = 0; i < 5; i++) {
output[i] = (function(i) {
return function() {
console.info(i);
}
})(i);
}
output[0](); // logs 5, not the expected 0
output[1](); // logs 5, not the expected 1
output[2](); // logs 5, not the expected 2
output[3](); // logs 5, not the expected 3
output[4](); // logs 5, not the expected 4letThe
letstatement declares a block scope local variable, optionally initializing it to a value.
var output = [];
for (let i = 0; i < 5; i++) {
output[i] = function() {
console.info(i);
}
}
output[0](); // logs 5, not the expected 0
output[1](); // logs 5, not the expected 1
output[2](); // logs 5, not the expected 2
output[3](); // logs 5, not the expected 3
output[4](); // logs 5, not the expected 4