Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Аргумент функции внутри цикла - можно? (https://javascript.ru/forum/misc/73691-argument-funkcii-vnutri-cikla-mozhno.html)

MC-XOBAHCK 07.05.2018 14:34

Аргумент функции внутри цикла - можно?
 
Здравствуйте!
Я не знаю как мне правильно сформулировать вопрос.
У меня такой код:
let butShag = document.querySelectorAll('.butShag');

for (let i = 0; i < butShag.length; i++) {
    butShag[i].addEventListener('click', function () {
        title(i); //Вот здесь i можно передавать?
    })
}

Можно ли так передавать индекс в title(i); ?
При клике на первую кнопку срабатывает, а на остальных даёт ошибку.
Или это недопустимо в JavaScript?

ruslan_mart 07.05.2018 14:43

let butShag = document.querySelectorAll('.butShag');

for (let i = 0; i < butShag.length; i++) {
    butShag[i].addEventListener('click', function (i) {
        title(i);
    }.bind(butShag[i], i))
}


Но правильней будет вынести функцию обработчика, чтобы не создавать её каждый раз по новой.
А ещё правильней будет не использовать цикл, а использовать метод массива forEach, тогда и проблема с индексом отпадёт.

let butShag = document.querySelectorAll('.butShag');

function onClick(index, event) {
    title(index);
}

Array.prototype.forEach.call(butShag, (item, index) => item.addEventListener('click', onClick.bind(item, index));

рони 07.05.2018 14:45

MC-XOBAHCK,
Пример ошибочного использования

Alexandroppolus 07.05.2018 15:16

возможно, стоит подумать о делегировании

рони 07.05.2018 15:39

Цитата:

Сообщение от ruslan_mart
А ещё правильней будет не использовать цикл, а использовать метод массива forEach,

[].forEach.call(document.querySelectorAll('.butShag'), function(node, index) {
   node.addEventListener("click", function() {
   title(index);
  })
});

MC-XOBAHCK 07.05.2018 15:49

Спасибо всем за науку.
Для меня методы в предложенных решениях новЫ, я про них читал и видел, но никогда не использовал.
Вот видимо пришло время и повод чтобы их осваивать.


Часовой пояс GMT +3, время: 20:49.