CoffeeScript - 函数runnning但它“不是函数”

时间:2017-02-09 04:48:30

标签: javascript coffeescript

感谢您的帮助。我有一个简单的功能来逐个显示(或隐藏)元素,它是用CoffeeScript编写的。该功能效果很好,但我的Chrome会在控制台

中抛出此消息
  

“未捕获的TypeError:elemRoll(...)不是函数”

  • 我做错了什么?

 elemRoll = (elemName, delayDuration, animationDuration) -> 
    		amount = $(elemName).length
    		$(elemName).each (amount) ->
    			$(this).delay(delayDuration * amount).animate { 'opacity': 1 }, animationDuration

$(document).ready -> 
    	do elemRoll '.epoch-container .epoch-item', 190, 160

1 个答案:

答案 0 :(得分:2)

您不需要do来简单地调用函数,并且您很少想要将do用于此目的。您的准备处理程序应该只是:

$(document).ready -> 
  elemRoll '.epoch-container .epoch-item', 190, 160
  # No `do` in here

CoffeeScript's do意味着立即执行匿名函数:

  

CoffeeScript提供do关键字,它立即调用传递的函数,转发任何参数。

通常,当您需要封装包装时,它将用作循环体:

for e in array
  do (e) -> ...

您还可以使用它在循环外执行匿名函数:

do (a) -> ...

成为这个JavaScript:

(function(a) { /* ... */ })(a);

您也可以使用它来执行没有括号的无参数函数,因此do f变为f()

你的问题是:

do a b

被解释为

do a(b)

成为这个JavaScript:

a(b)();

所以你的:

do elemRoll '.epoch-container .epoch-item', 190, 160

与写作相同:

f = elemRoll '.epoch-container .epoch-item', 190, 160
do f

并且CoffeeScript假设elemRoll '.epoch-container .epoch-item', 190, 160返回一个函数。

此外,您需要非常小心并与空白一致,否则可能会发生令人困惑的事情。