Замыкания в 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. Как это можно обойти?
  • Вопрос задан
  • 2781 просмотр
Решения вопроса 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
Предложенный способ совсем не оптимальный. Лучше как-то привяжите данные непосредственно к объекту, а в обработчике их доставайте. Иначе для каждого обработчика у вас получается своя копия функции со своим замыканием.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы