如何将变量传递给for循环中的函数

时间:2013-10-17 06:30:32

标签: jquery coffeescript keyboard-shortcuts

我正在尝试在javascript中为数字1到9设置一些键绑定,然后点击页面上标有“show1”,“show2”等的各种链接。

问题是它为数字创建了键绑定,但它总是显示最后一项,即:'show9'。

这是一个例子,如果你在键盘上点击1或2,该功能将返回3,当它应该返回1&分别为2。

for i in [1..2]
    key i.toString(), (e) ->
        alert i

http://jsfiddle.net/DARxg/

1 个答案:

答案 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那样),但对于许多用例来说,它可能并不重要。我仍然可能会考虑上面第一个选项的清晰度,但是有很多工具可以使用。