Javascript转换模式:调用函数时出错
我试图在我的简单程序中实现求和乘法的currying模式。为此,我定义了一个通用的curry函数,并在其中调用sum和multiply函数,但没有得到任何输出。有人能告诉我我的程序出了什么问题吗?提前谢谢 代码::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
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
的结果,而不是将一个新函数添加到参数中的结果。