Я новичок в HTML / JS и пытаюсь изучить все странности. Пытаясь заставить это работать, я узнал, что разрешен только один Element.onclick = function() {}, и если вы попытаетесь добавить больше, предыдущие будут перезаписаны. Но теперь я сталкиваюсь с тем же самым, используя Element.addEventListener("click", function() {}). Вот мой код:
<html>
<body id = "body">
</body>
</html>
<script>
window.onload = function() {
for (var buttonText of ["item1", "item2", "item3"]){
var button = document.createElement("button");
button.textContent = buttonText;
button.addEventListener("click", function(){
console.info(`${buttonText} was clicked!`);
});
document.getElementById("body").append(button);
}
}
</script>
Независимо от того, какая кнопка нажата, консоль всегда говорит item3 was clicked!. Где я ошибаюсь?



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


Это связано с областью действия переменной. addEventListener добавит событие, и в этот раз, хотя обратный вызов сработает, но цикл завершился, его выполнение, и buttonText будет обновлен с последним значением. Это приводит к тому, что buttonText всегда будет item3. Один из вариантов - заменить for (var buttonText of ["item1", "item2", "item3"]) { на for (let buttonText of ["item1", "item2", "item3"]) {.
window.onload = function() {
for (let buttonText of ["item1", "item2", "item3"]) {
let button = document.createElement("button");
button.textContent = buttonText;
button.addEventListener("click", function() {
console.info(`${buttonText} was clicked!`);
});
document.getElementById("body").append(button);
}
}<div id='body'></div>Другой вариант - вы можете создать closure и IIFE.
window.onload = function() {
for (var buttonText of ["item1", "item2", "item3"]) {
// start of IIFE
(function(txt) {
var button = document.createElement("button");
button.textContent = txt;
button.addEventListener("click", function() {
console.info(`${txt} was clicked!`);
});
document.getElementById("body").append(button);
}(buttonText))
}
}<div id='body'></div>
Ах,
letделает свое дело! Теперь поискать в Google разницу :)