如何在coffeescript循环中捕获异步函数的变量?

Lee*_*lla 3 javascript loops coffeescript

我循环遍历一个对象,并尝试为onclick对应于对象中每个项目的每个按钮添加一个事件.

for id of obj
    button = $("#my_button"+ id)
    button.click(->  console.log id) 
Run Code Online (Sandbox Code Playgroud)

使用此循环,每个按钮都会记录循环的最后一个 id.如何让每个按钮记录正确的相应ID?

Tre*_*ham 9

这是一个经典的JavaScript问题.标准解决方案是将每个循环迭代包装在一个匿名函数中,并传入id该函数; 这样,您传递给的函数click将看到该特定id实例.

CoffeeScript为此提供了一个很好的语法:do (id) -> ...编译为(function(id){ ... })(id).所以,对于你的例子,你要写

for id of obj
  do (id) ->
    button = $("#my_button"+ id)
    button.click(->  console.log id)
Run Code Online (Sandbox Code Playgroud)

do在文章A CoffeeScript Intervention中谈到.