Я не уверен, как решить этот вопрос о закрытии анонимной функции из моего учебника

Вопрос такой:

«Один из ваших коллег написал следующую процедуру кода, но она работает не так, как она ожидала. Вы можете объяснить, почему? Как бы вы исправили код, чтобы он давал результат, которого ожидал ваш коллега?»

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 руководства по закрытию, я просто не понимаю этот вопрос. Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
15
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Таким образом, в основном каждое выполнение будет использовать последнее присвоенное значение i.

У вас есть два варианта

1. IIFE

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 4

2. Заявление let

The let statement 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

Другие вопросы по теме