Я пытаюсь добавить прослушиватель событий к кнопкам, используя цикл for Внутри цикла я объявил анонимную функцию. базовый тест (алерт) работает Но когда я пытаюсь вызвать метод внешнего класса, это не сработает.
Класс работает вне этого цикла Предупреждение и весь код работают нормально (ошибки времени выполнения нет)
Что мне не хватает?
for (let i = 0; i < buttons.length; i++) {
(function() {
var j = i;
buttons[j].addEventListener(
'click',
function() {
alert('hello world ' + j);
classname0.method(buttons[j].id);
},
false,
);
})();
}
Можете ли вы поделиться кодом класса, о котором вы говорите?
class
- это зарезервированное имя в javascript (даже если оно не используется). Также доступен ли ваш class
в области, в которой вы разрушаете цикл или вызываете функцию?
Я пытался анонимизировать настоящее имя класса, исправлю
Итак, когда вы говорите «класс работает вне этого цикла», что он делает? а когда не работает, значит, что не работает.
метод просматривает дом и обновляет его. также работает без анонимной функции и внутри обещания внутри цикла ...
Я не вижу причин для IIFE, это обычно делается для создания новой области в цикле for с асинхронным кодом или кодом обработки событий, но вам не нужно создавать область, потому что пусть заявление решает это (я больше поклонник использования для каждого вместо этого).
Хорошо, как ты посоветуешь, что я тогда с этим справлюсь? какой правильный синтаксис?
В вашем вопросе недостаточно информации, чтобы понять, что не так.
Вы пишете свою функцию таким образом
(function(){ ... }() )
вместо
(function(){ ... })()
это потому, что теперь он выполняется, а не раньше, это могут быть другие ошибки. Как сказал Никос М., класс - это зарезервированное ключевое слово. Дайте нам больше информации. Покажите, пожалуйста, ваше определение classname0.
@SylvanLEDEUNFF О чем вы говорите, оба способа написания IIFE совершенно одинаковы.
Возможно, я ошибаюсь, но я никогда не встречал этого ни в одной официальной документации, такой как developer.mozilla.org/fr/docs/Glossaire/IIFE
Может быть, вам просто нужно «вызвать», чтобы получить правильное «это» в вашем классе.
classname0.method.call(classname0, buttons[j].id);
Обратите внимание, что лучше использовать console.info для отладки вместо предупреждения