我正在尝试在javascript中为数字1到9设置一些键绑定,然后点击页面上标有“show1”,“show2”等的各种链接。
问题是它为数字创建了键绑定,但它总是显示最后一项,即:'show9'。
这是一个例子,如果你在键盘上点击1或2,该功能将返回3,当它应该返回1&分别为2。
for i in [1..2]
key i.toString(), (e) ->
alert i
答案 0 :(得分:3)
您正在创建的函数对i
变量有持久引用,而不是创建函数时的副本,这就是为什么您总是看到它的最终结果价值(3
)。
更新:在答案结束时有更多的CoffeeScript-ish方式,虽然阅读整个内容非常有用,因此您可以理解权衡。
相反,使用构建函数创建关闭不同变量的函数,该函数不会更改:Updated Fiddle
buildHandler = (value) ->
(e) ->
alert value
return
for i in [1..2]
key i.toString(), buildHandler i
在那里,我们的处理函数关闭了我们传递的参数buildHandler
,因此它不会改变。
更多:Closures are not complicated(但基于JavaScript,而不是CoffeeScript)
对于那些真正喜欢立即调用的函数表达式(IIFE)的人(我不建议在循环中使用IIFE,理论上它每次创建一个新函数只是为了抛弃它,而且很难阅读):< / p>
for i in [1..2]
key i.toString(), (
(value) ->
(e) ->
alert value
return
)(i)
mu is too short在评论中指出,CoffeeScript有一个关键字,用于完成此操作:do
它接近文档this section的末尾。使用它看起来像这样:
for i in [1..2]
key i.toString(), do (i) -> (e) ->
alert i
return
现在,它被转换为JavaScript,它会创建不必要的函数并抛弃它们(就像上面的IIFE那样),但对于许多用例来说,它可能并不重要。我仍然可能会考虑上面第一个选项的清晰度,但是有很多工具可以使用。