我知道可能没有任何理由将其用于创建可变参数函数的其他方式,但在语义上是否可以定义某些内容来执行此操作?例如,它可以像sum(1)(2)(3)();
一样调用。我尝试使用以下代码实现它:
function sum(x) {
return function(y) {
if (!y) return 0;
else return x + sum(y);
};
}
然而,在调用时,这会给出TypeError: string is not a function
。什么会导致这返回一个字符串?当我更仔细地检查它时,它看起来像是将函数的代码作为字符串返回,这对我来说毫无意义。也就是说,我并不十分熟悉错综复杂的JavaScript的语义,所以我可能会错过一些巨大的概念。
答案 0 :(得分:1)
sum(1) -> ref Function(y)
sum(1)(2) -> invocation Function(2)
Function(2) -> 1 + (sum(y) -> sum(2) -> ref Function(y))
现在,1 + (ref Function(y))
,您可以看到,您正在添加数字和参考。
javascript认为你正在尝试连接,因此它在内部调用ToString
Function
方法,它将函数体作为字符串。
所以,下次你打电话时,你正在调用一个字符串,因此错误就像字符串一样不是一个函数。
正确的代码将是Bergi实施的。
答案 1 :(得分:1)
如评论中所述,x
是一个数字,sum(y)
是一个函数。在它们上使用+
运算符使用它们的gcd类型,它们是字符串,不能被调用。
你不能在javascript中curry运算符。您需要显式返回curried函数,并告诉它何时计算值。我们的功能的适当修复将是
function sum(x) {
return function(y) {
if (!y) return x;
// ^
else return sum(x + y);
// ^^^
};
}