柯里化是把一个接受多个参数 的函数,转换成接受单一参数(或部分参数)并返回一个新函数,直到收到全部所需参数后才执行原函数的过程。
例如:
javascript
function add(a, b, c) { return a + b + c }
const curriedAdd = curry(add);
curriedAdd(1)(2)(3) // 6
curriedAdd(1, 2)(3) // 6
curriedAdd(1)(2, 3) // 6
本质是参数收集 ,当收集到的参数个数达到原函数定义的形参个数(fn.length)时,就调用原函数。
代码
javascript
const curry = (fn, ...args) => {
if (args.length >= fn.length) {
return fn(...args)
} else {
return (...rest) => {
return curry(fn, ...args, ...rest)
}
}
}
注意:这里的fn.length是函数定义时声明的形参个数(不包括剩余参数)。一般这个实现是针对常规固定参数函数的。