Проблема закрытия: передача «события» в именованную функцию - PullRequest
3 голосов
/ 13 июля 2011

Я отлаживаю немного Javascript, который страдал от небольшой проблемы с закрытием - но, похоже, не смог передать аргумент «событие» в функцию.Вот проблема (сокращенно):

// let's say links.length == 3
for(var i = 0; i < links.length; i++){
      links[i].onclick = function(e){
          alert(i); //closure! all links alert "3"
          // do something with "e"
      }
}

Вот мое решение

//workaround

// define function outside of loop
function outer(e,i){
     return function(){
         alert(i); //closure! all links alert "3"
        // do something with "e"
    }
}

for(var i = 0; i < links.length; i++){
      links[i].onclick = outer(e,i); //uh oh! e = undefined???
}

В своем обходном пути я определил функцию вне цикла, чтобы предотвратить замыкание - но я не могупередать ему аргумент "е".Может ли кто-нибудь указать мне правильное направление?

1 Ответ

4 голосов
/ 13 июля 2011

Определите его в возвращаемой функции.

function outer(i){
       // ------------v-- event object is passed when this function is invoked
     return function( e ){
         alert(i); 
    }
}


for(var i = 0; i < links.length; i++){
      links[i].onclick = outer(i); 
}

Объект event передается , когда происходит событие , поэтому его необходимо определить как параметр функции, которая в конечном итоге назначается обработчиком (функция, которую вы возвращаете из outer()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...