Я использую такой код для передачи аргументов в функции обработчика событий. Но в этом конкретном случае цикл вызывает проблемы. Только последние linkTags [i] доступны во всех активных вызовах Visual. Это связано с тем, что анонимная функция, которая передает аргумент, является одним и тем же для всего цикла.Могу ли я передать «новую» анонимную функцию addEventListener
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Теперь, я помню, пытаясь добавить новый перед анонимной функции декларации, как это:
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
new function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Это не сработало. ActiveVisual никогда не будет вызван. Может кто-нибудь объяснить мне, почему и как я могу заставить его работать, пожалуйста?
UPDATE окончательное решение
Благодаря все ответы ниже моего рабочего кода теперь выглядит следующим образом:
// Function that provides pass of event handling parameters with separate copy in each loop
function callbackHandler(index) {
return function(evt) {
activeVisual(evt, linkTags[index]);
}
}
...
for (var i = 0; i < linkTags.length; i++) {
...
addCrossEvent(linkTags[i], "mousedown", callbackHandler(i));
}
Если итератор я переменная является проблема как же это не вызывает проблем в этой линии addCrossEvent (linkTags [я], «клик», launchLink); ? Это только передается путем анонимности? –
, потому что когда вы делаете addCrossEvent (linkTags [i], «click», launchLink); у вас есть значение i в массиве linkTags для каждого цикла, но когда функция вызывается в событии, у меня есть последнее значение, и вы получили только одну и ту же позицию в массиве – madeinstefano
@ avok00: В 'addCrossEvent (linkTags [i ], «click», launchLink) 'вы передаете значение' linkTags [i] 'непосредственно в функцию.Но 'activeVisual (evt, linkTags [i]);' в * обратном вызове * вычисляется при вызове обратного вызова * * * в цикле. Но когда вызывается обратный вызов, цикл уже завершен, а 'i' имеет свое окончательное значение. –