什么是柯里化?
柯里化是指将一个函数 fn(a, b, c) 转变为可以用 fn(a)(b)(c) 调用的形式
能够进行柯里化转换的方法接收的参数个数都是固定的,像是 fn (...args) 这样接收不确定参数的方法不能进行柯里化
那么怎么实现呢,先考虑一种简单的情况
const sum = (a, b) => {
return a + b
}
const curry = (fn) => {
// ...
}
const curriedSum = curry(sum)
curriedSum(1)(2) //
怎么实现 curriedSum(1)(2) 这样的调用呢,只要保证 curriedSum(1) 返回的也是一个 function,并且接收一个参数就行了,由此,我们写出实现的代码
const curry = (fn) => {
return function (a) {
return function (b) {
return fn (a, b)
}
}
}
那么开始思考,这是实现了传入两个参数的方法的柯里化,那么传入三个参数呢,只需要再加一层 return function,那么传入任意个参数呢,要怎么实现呢
通过 fn.length 我们可以拿到原来的方法需要的参数个数,那么我们的思路就是,递归调用 curry,将要调用的参数作为参数传入,每次递归调用,要调用的参数都会增加并保存下来,直到和 fn.length相等,此时结束递归,调用 fn即可
const curry = (fn, ...args) => {
if (fn.length > args.length) {
return function (...args2) {
return curry(fn, ...args, ...args2)
}
}
return fn(...args) // else
}