Javascript转换模式:调用函数时出错

Javascript转换模式:调用函数时出错,javascript,Javascript,我试图在我的简单程序中实现求和乘法的currying模式。为此,我定义了一个通用的curry函数,并在其中调用sum和multiply函数,但没有得到任何输出。有人能告诉我我的程序出了什么问题吗?提前谢谢 代码:: function curry(fn) { sum.call(this, a,b); multiply.call(this, a,b,c); } function sum(a, b) { return a + b; } function multiply(a

我试图在我的简单程序中实现求和乘法的currying模式。为此,我定义了一个通用的curry函数,并在其中调用sum和multiply函数,但没有得到任何输出。有人能告诉我我的程序出了什么问题吗?提前谢谢

代码::

function curry(fn) {
    sum.call(this, a,b);
    multiply.call(this, a,b,c);
}

function sum(a, b) {
    return a + b;
}

function multiply(a, b, c) {
    return a * b * c;
}

const curriedSum = curry(sum);
const curriedMult = curry(multiply);

const addOne = curriedSum(1);
const addTwo = curriedSum(2);
预期输出::

// 1 + 3 = 4
console.log('result', addOne(3));      // 'result'   4


// 1 + 1 = 2
console.log('result', addOne(1));     // 'result'   2


// 2 + 5 = 7
console.log('result', addTwo(5));     // 'result'   7


// 2 * 3 * 4 = 24
console.log('result', curriedMult(2)(3)(4));    // 'result'   24

我认为您应该后退一步,询问您希望
curry
函数返回什么。您使用它的方式表明您希望它返回一个函数,因此它至少需要这样做。该函数看起来也应该包含参数,因为您正以这种方式使用它

所以…只需返回一个函数,该函数接受参数并将它们绑定到传递给
curry
的函数,然后返回该函数

const curry = (fn) => (...a) => fn.bind(null, ...a)
这说明
curry
是一个函数,它接受一个函数参数(
fn
),并返回一个新函数,该函数接受参数并返回另一个函数,该函数是
fn.bind

要使用它,您可以:

const curry=(fn)=>(…a)=>fn.bind(null,…a)
函数和(a,b){
返回a+b;
}
函数乘法(a、b、c){
返回a*b*c;
}
const curriedSum=咖喱(总和);
常数curriedMult=curry(乘法);
const addTwo=curriedSum(2);
console.log(addTwo(10))//2+10
常数mult10=当前结果(10)
//因为我们在咖喱里撒了ARG给你
//可以传递两个参数
log(mult10(10,2))//10*10*2
//或者你甚至可以再做一次咖喱:
常数mult20=当前结果(20)
const curriedMult20=咖喱(mult20)
常数mult20_10=电流结果20(10)

console.log(mult20_10(2))//20*10*2
在curry函数中,问题是您没有调用正在传递的fn, 您必须保持fn处于闭包状态,并返回等待第二个paremater调用自身的新函数

您可能想查看有关Clouser的优秀文章

这里还有代码的工作示例

const curry=(fn)=>(…args)=>fn(…args)
函数和(a,b){
返回a+b;
}
函数乘法(a、b、c){
返回a*b*c;
}
const curriedSum=咖喱(总和);
常数curriedMult=curry(乘法);
const addOne=curriedSum(1,2);
常数addTwo=curriedSum(2,3);
常数倍数=当前结果(2,3,4)
console.log(addOne)
console.log(addTwo)

console.log(多个)
您看到了什么错误?我没有收到任何输出您的
curry
函数没有任何输出。它还尝试使用两个未定义的值调用
sum
,因为
a
b
仅在实际的
sum
函数中定义,而不是
call
curry
没有
return
语句,因此它默认返回
未定义的
(但正如异教徒猴子所说,它实际上并没有完成执行,因为
a
b
没有声明)。有关curry函数的示例,请参见。这实际上不是什么。它只是将函数包装到一个新函数中。保存在
addOne
中的值只是
1+2
的结果,而不是将一个新函数添加到参数中的结果。