javascript - 理解对象的属性+回调

标签 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

但我猜当 console.log(k) 被执行时 k 已经改变了?如何修复它,使输出为“jim, james”?

最佳答案

您遇到了经典的 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);
};

关于javascript - 理解对象的属性+回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9001828/

相关文章:

javascript - 三元运算符、if-else 或逻辑 OR 在 javascript 中更快吗?

javascript - AJAX 表单部分有效

javascript - 用于编写更简洁代码的 CoffeeScript 资源

javascript - 使用 Konacha/Poltergeist(和 Rails)测试点击事件

javascript - 使用 CoffeeScript 为选择框选择默认值

当数组中只有一项时,JavaScript Join 会插入逗号分隔符

javascript - jQuery 按值选择选项元素

php - 如何在 5 分钟后重定向到另一个页面?

javascript - 使用来自 jQuery (Coffeescript) 的 JSON 响应

ruby - 在 Rails3.1 ubuntu 11.04 中使用 CoffeeScript