感谢您的帮助。我有一个简单的功能来逐个显示(或隐藏)元素,它是用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
答案 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
将返回一个函数。
此外,您需要非常小心并与空白一致,否则可能会发生令人困惑的事情。