Переменная в неправильной области видимости (может быть, нуждается в закрытии?)

#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 ?