什么是函数curry化

在计算机科学中,柯里化(Currying)是把接收多个参数的函数变成接收单一参数的函数,并且返回接受余下的参数且返回结果的新函数的技术。

  • 通过fn.length可以获取形参个数
  • 闭包存储单个参数
  • 存储的参数达到fn.length,则认为参数传递完毕,直接执行fn
type Curry = {
    (fn: (...args: any[]) => any): any
}
const curry: Curry = function (fn) {
    // 收集fn的形参个数,作为判断依据
    const presetLength = fn.length
    const argsArr: any[] = []
    return function handle(): any {
        const args = Array.prototype.slice.call(arguments)
        args.length && argsArr.push(...args)
        // 判断收集的参数是否达到限值:没达到则继续返回收集函数;达到则直接执行;
        if (argsArr.length < presetLength) {
            // @ts-ignore
            return handle.bind(this)
        } else {
            // @ts-ignore
            return fn.apply(this, argsArr)
        }
    }
}
const testCurry = (a: number, b: number, c: any) => a + b + c
 
const curryDemo = curry(testCurry)
 
console.log(curryDemo(1)(2)(3, 4));