为什么我的CoffeeScript程序发出“号码不是函数”错误?

时间:2012-01-28 03:47:04

标签: coffeescript

在下面的程序中,前两个日志工作正常。我在第三个和最后一个日志中没有做任何新的事情,但不知何故它在运行时崩溃了。我的脚本中的错误在哪里?我已经多次查看它,它似乎是对它上面经过验证的工作代码的一个相当微不足道的修改。

sumSq = (n) -> ([0..n].map (i) -> i * i).reduce (a, b) -> a + b
sq = (n) -> n * n
sqSum = ((n) -> ([0..n].reduce (a, b) -> a + b))
console.log(sqSum 5)
console.log(sq(sqSum 5))
newSqSum = sq ((n) -> ([0..n].reduce (a, b) -> a + b))
console.log(newSqSum(5))

1 个答案:

答案 0 :(得分:0)

这是一个功能,而不是数字:

(n) -> ([0..n].reduce (a, b) -> a + b)

所以当你这样说:

newSqSum = sq ((n) -> ([0..n].reduce (a, b) -> a + b))

你用函数作为参数调用sq。然后sq将尝试将该函数与其自身相乘,结果将为NaN,因为函数没有合理的数字表示。最后,您的第三个console.log尝试将NaN值称为函数,并且出现错误消息。

对于函数fn1 fn2f1f2形式的某些内容不是函数组合,它实际上与编写fn1(fn2)并且赢得了'相同'除非fn1显式构造为返回函数,否则生成新函数。如果你想编写这些函数,那么我认为你需要手工完成:

newSqSum = (n) -> sq ((n) -> ([0..n].reduce (a, b) -> a + b)) n
# Or with less hate for the people maintaining your code:
newSqSum = (n) -> sq sqSum n