Javascript 对对象属性的理解+;回拨

Javascript 对对象属性的理解+;回拨,javascript,coffeescript,Javascript,Coffeescript,起初,我对以下代码发生了什么感到有点困惑: 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){ setTimeo

起初,我对以下代码发生了什么感到有点困惑:

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

您遇到了经典的JavaScript关闭问题。请参阅的“循环和理解”部分中有关“闭包包装器”的部分

解决您问题的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);
};

废话,事实上在CoffeeScript网站上有很好的记录。非常感谢你指出这一点。