【前端手撕】函数柯里化curry

柯里化是把一个接受多个参数 的函数,转换成接受单一参数(或部分参数)并返回一个新函数,直到收到全部所需参数后才执行原函数的过程。

例如:

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是函数定义时声明的形参个数(不包括剩余参数)。一般这个实现是针对常规固定参数函数的。