Вы столкнулись с классическими проблемами закрытия 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);
};