【问题标题】:How do I pass a variable onto a function in a for loop [duplicate]如何将变量传递给for循环中的函数[重复]
【发布时间】:2013-10-25 12:43:51
【问题描述】:

我正在尝试在 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/

【问题讨论】:

标签: jquery coffeescript keyboard-shortcuts


【解决方案1】:

您正在创建的函数有一个对i 变量的持久引用,而不是在创建函数时它的副本,这就是为什么您总是看到它的最终值的原因( 3)。

更新:答案末尾有一种更类似于 CoffeeScript 的方式,尽管阅读整篇文章很有用,以便您了解权衡取舍。

相反,使用构建器函数创建关闭不同变量的函数,该变量不会改变: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,理论上它每次都会创建一个新函数只是为了扔掉它,而且很难阅读):

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

mu is too short 在 cmets 中指出,CoffeeScript 有一个关键字可以做到这一点:do 它在文档的this section 末尾附近。使用它看起来像这样:

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

现在,它被转换为创建不必要的函数并将它们丢弃的 JavaScript(就像上面的 IIFE 所做的那样),但对于许多用例来说,这可能并不重要。我可能仍然会选择上面第一个选项的清晰度,但最好有很多工具。

【讨论】:

  • CoffeeScript 有专门针对这类事情的 do 关键字,请参阅本节底部:coffeescript.org/#loops
  • @muistooshort:哇,谢谢!我把它折进去了。
  • 感谢您的深入回答。我同意您的第一个答案更容易阅读。
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多