如何在CoffeScript中将两个匿名函数作为参数传递?

55

我想将两个匿名函数作为jQuery的hover方法的参数传递,像这样:

$('element').hover(
  function() {
    // do stuff on mouseover
  },
  function() {
    // do stuff on mouseout
  }
);

只需要一个 hover -> 就可以实现,但是如果要使用两个的话,在 CoffeeScript 中应该怎样写呢?我尝试了 ...hover ->...hover( ->... 等等,但都无法得到上述的结构。


1
给你的匿名函数命名。现在就做。如果你没有适当的名称,那么就称它们为 fg: f = (...) -> ..., g = ...。然后 ( $ 'element' ).hover f, g。如此简单,如此表达力。 - flow
4个回答

52

我认为问题在于使用单行注释//。使用/* ... */括起来的单行注释似乎可以正常工作。以下是一个使用其他内容而不是注释的等效示例。

$('element').hover(
  -> console.log("first")
  -> console.log("second")
)

也可以使用注释的形式,例如 /* .. */

$('element').hover(
  -> /* first */
  -> /* second */
)

你可以在尝试 CoffeeScript选项卡下尝试这些示例。CoffeeScript会添加一个return语句,以返回函数的最后一个表达式。如果你想要什么都不做且不包含结尾return的基本函数,请尝试:

$('element').hover(
  () ->
  () ->
)
// $('element').hover(function() {}, function() {});

1
如果有人偶然发现这个问题:小心不要在这里插入空格:hover(,否则你会得到多余的括号。 - punund

25

在匿名函数周围加上括号。


我发誓我做到了 - 我之前提到的hover(-> - 但我又做了一遍,它起作用了。谢谢! - glortho
1
需要注意的是,在hover和括号之间不能有任何空格。 $(@).hover() != $(@).hover () 否则,输出将被包裹在另一组括号中。 - user627542
这个答案中信息不足,Anurag的回答更好地解释了该怎么做。 - ObjectNameDisplay

21

另一种方法是在调用函数之后使用反斜杠,逗号应正确缩进。

$('element').hover \
  -> # do stuff on mouseover
  ,
  -> # do stuff on mouseout

谢谢,\非常好用。在代码行很长时,我们不需要搜索和查找)。使用\与,非常简单。我感觉在再次使用()时像jquery一样。 - Sudhakar Krishnan

8

不使用括号或反斜杠

f ->
  0
, ->
  1

在1.7.1版本中的输出:

f(function() {
  return 0;
}, function() {
  return 1;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接