理解对象+回调的属性

时间:2012-01-25 11:19:50

标签: 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){

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

};

//OUTPUT
//james
//james

但我猜控制台.log(k)执行时k已经改变了吗?你怎么解决它,所以输出是“吉姆,詹姆斯”?

1 个答案:

答案 0 :(得分:2)

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

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