вам нужно замыкание внутри цикла, где вы присоединяете обработчики событий, чтобы захватить значение i
в каждой итерации цикла.
for(var i=0;i<Controls.length;i++) {
(function() {
var Control=Controls[i];
Event("add",function(){
var lorem=new Lorem(Control);
lorem.Control=Control;
alert(lorem.Amet());
},"click",Controls[i]);
})();
};
Здесь я создал замыкание выше, используя хорошего друга JavaScript, самовозглашающуюся анонимную функцию.
Причина, по которой требуется закрытие, состоит в том, что без него значение i
в точке, в которой выполняется любая функция-обработчик события, будет значением i
в последней итерации цикла, а не тем, что мы хотим. Мы хотим, чтобы значение i
было таким, как оно есть на каждой итерации цикла, в точке, в которой мы объявляем каждую функцию-обработчик события, поэтому нам нужно захватить это значение на каждой итерации. Использование анонимной функции, которая выполняется, как только она объявлена, является хорошим механизмом для захвата желаемого значения.
Еще один момент, немного не по теме, но он может вам помочь, это то, что захват событий поддерживается не во всех браузерах ( ahem , IE), но всплывающее окно событий. Это фактически делает логический флаг useCapture
в addEventListener
совершенно бесполезным для разработки кросс-браузерных веб-приложений. Поэтому я бы посоветовал не использовать его.
Еще одна вещь, JavaScript обычно использует верблюжий корпус для имен функций и имен переменных. Оболочка Паскаля обычно используется только для функций конструктора (функций, которые создают объекты).