Для полноты, вот объяснение, почему ваш способ использования new
не работает:
Когда вы вызываете функцию с new
, функция генерирует пустой объект (который вы можете использовать с помощью this
внутри функции и который наследует от прототипа функции) и возвращает его.
Таким образом, вы фактически не передаете функцию в качестве обработчика обратного вызова, но объект возвращается функцией.
Это не проблема, если объект реализует интерфейс EventListner
для использования в качестве обработчика событий. Если вы сделаете это, вы можете использовать свой код с некоторыми изменениями:
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
new (function(index) {
this.handleEvent = function(evt) {
activeVisual(evt, linkTags[index]);
}
})(i));
}
Это на самом деле похоже на ответ @ Luca, потому что значение i
фиксируется при создании объекта. Верхний код фактически идентичен:
function CallbackHandler(index) {
this.handleEvent = function(evt) {
activeVisual(evt, linkTags[index]);
}
}
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown", new CallbackHandler(i));
}
При этом я считаю, что использование немедленной функции, которая возвращает функцию, более удобную для чтения, и я думаю, что использование функции в качестве обработчика событий вместо объекта также более распространено.
Рабочая ДЕМО