Замыкания в JS

Есть массив объектов, для каждого объекта нужно назначить обработчик события наведения мышки, клика по объекту, движения мыши и т.д.

Вот код:

for (var i = 0; i < Obj.Sectors.length; i++) {

Obj.Sectors[i].mousemove(function (event) {

Obj.Popup(event.clientX, event.clientY, i);

});

}


Проблема в том, что при срабатывание события в функцию Popup всегда передается одинаковый счетчик цикла i, равный Obj.Sectors.length+1. Как это можно обойти?
  • Вопрос задан
  • 2768 просмотров
Решения вопроса 1
ArtemSmirnov
@ArtemSmirnov
Очень частая ошибка, попробуйте так:
<source language=«javascript>
for (var i = 0; i < Obj.Sectors.length; i++) {
(function (i) {
Obj.Sectors[i].mousemove(function (event) {
Obj.Popup(event.clientX, event.clientY, i);
});
})(i);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Quadratoff
@Quadratoff
Может перестанем использовать старомодный for и перейдем на более читабельный и лаконичный each/map?

Obj.Sectors.each(function(sector, sectorIndex){
    sector.mousemove( function(event){
        Obj.Popup(event.clientX, event.clientY, sectorIndex);
    });
});
Ответ написан
homm
@homm
Предложенный способ совсем не оптимальный. Лучше как-то привяжите данные непосредственно к объекту, а в обработчике их доставайте. Иначе для каждого обработчика у вас получается своя копия функции со своим замыканием.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Intspirit Краснодар
от 80 000 до 150 000 ₽
28 янв. 2021, в 04:36
5000 руб./в час
28 янв. 2021, в 03:43
2000 руб./за проект
28 янв. 2021, в 02:42
120000 руб./в час