#javascript #closures #lexical-closures
#javascript #замыкания #лексические замыкания
Вопрос:
У меня есть следующий код, который нуждается в закрытии:
var numItems = document.getElementsByClassName('l').length;
for (var i = 0; i < numItems; i ) {
document.getElementsByClassName('l')[i].onclick = function (e){
preview(this.href, i);
};
}
Что происходит, так это то, что всякий раз, когда щелкают по элементу, всегда отображается один и тот же номер для i
Я подозреваю, что мне нужно сделать это
function indexClosure(i) {
return function(e) {
preview(this.href, i);
}
}
И назначьте onclick следующим образом:
document.getElementsByClassName('l')[i].onclick = indexClosure(i);
Но тогда this
больше не будет ссылаться на мою ссылку… как решается эта проблема?
Комментарии:
1. Это делает: jsfiddle.net/eKuh3 .
Ответ №1:
Используйте закрытие для захвата счетчика цикла:
var numItems = document.getElementsByClassName('l').length;
for (var i = 0; i < numItems; i ) {
(function(i){
document.getElementsByClassName('l')[i].onclick = function (e){
preview(this.href, i);
};
}(i))
}
Ответ №2:
разве onclick не проходит, (sender, eventArgs)
позволяя вам получить доступ this
через sender
?