@RedSmoke_smr

Почему не работает функция внутри цикла?

Здравствуйте! Подскажите пожалуйста, почему не работает функция внутри цикла ?
for (var i = 0; i < openTextButtons.length; i++) {
        openTextButtons[i].addEventListener('click', function () {
            fullText[i].classList.toggle('visually-hidden');
        })
    }

При это ide PHPStorm выдает предупреждение (Mutable variable is accessible from closure less...
Inspection info: Checks for accessing mutable JavaScript variables in nested functions . The validation works in JavaScript, html, or jsp files) а при клике на кнопку в браузере в консоли пишет ошибку (Uncaught TypeError: Cannot read property 'classList' of undefined at HTMLButtonElement.)
Но если внутри функции вместо fullText[i] поставить fullText[0] (или индекс любого другого элемента массива, то все работает хорошо, но если каждый так прописывать то код получается слишком большой)
Прошу оказать мне помощь в этом вопросе, как решить данную проблемы. Увы я только новичок и всему еще учусь(
Заранее спасибо за ответы
  • Вопрос задан
  • 829 просмотров
Решения вопроса 1
Piterski
@Piterski
Просто в цикле for замените объявление переменной var на let. А еще почитайте вот этот материал — https://github.com/azat-io/you-dont-know-js-ru/blo... чтобы понять почему так произошло. В вашем примере переменная i хранит всегда последнее значение в переборе цикла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
NeiroNx
@NeiroNx
Программист
потому что i вне зоны видимости для addEventListener. Можно сохранять ид в data аттрибут элемента для click а потом получать его используя this
Ответ написан
@abberati
frontend-разработчик
Внутри коллбэка-обработчика выведите в консоль i— увидите, почему код падает. Во всех обработчиках одно и то же значение.

В точности ваш пример с несколькими решениями.
https://learn.javascript.ru/task/make-army

Перед тем, как смотреть в решения, советую ознакомиться с уроком, к которому эта задача привязана. Ну или после.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы