Понимание свойств объекта + обратный вызов - PullRequest
1 голос
/ 25 января 2012

Сначала я был немного озадачен тем, что происходило со следующим кодом:

people =
  jim: 'Jim'
  james: 'James'

for k, v of people

  setTimeout( ( -> console.log(k) ), 300 )

#OUTPUT
#james
#james

Версия JavaScript:

var people = {
  jim: 'Jim',
  james: 'James'
};


for(var k in people){

  setTimeout( function(){ console.log(k); }, 300 );

};

//OUTPUT
//james
//james

Но я думаю, к тому времени console.log (k) исполняется k уже изменилось?Как это исправить, чтобы вывод "jim, james"?

1 Ответ

2 голосов
/ 25 января 2012

Вы столкнулись с классическими проблемами закрытия JavaScript.См. Раздел о «оболочках замыкания» в разделе «Циклы и понимание» документации CoffeeScript .

Решением CoffeeScript для вашей проблемы является ключевое слово do:

for k, v of people
  do (k) -> 
    setTimeout( ( -> console.log(k) ), 300 )

Поскольку вы включили Javascript-версию проблемы, решение Javascript будет выглядеть следующим образом:

for(var k in people){
  (function(k) { setTimeout( function(){ console.log(k); }, 300 ); })(k);
};

Но это безобразно, как грех, поэтому я предпочитаю такой подход, если я это сделаюв JS:

var delayedLog = function(k) {
  setTimeout( function(){ console.log(k); }, 300 );
};

for(var k in people){
  delayedLog(k);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...