一文彻底柯里化

215 阅读1分钟

柯里化

柯里化是一种处理多元函数的方法,它产生一系列连锁函数,其中每个函数固定部分,并返回一个新函数,用于传回其他剩余函数的功能。

经典的三数求和案例:

function add(a,b,c){
    return a+b+c
}
add(1,2,3) //6

按照柯里化的要求,我们的目的是把add函数转换成只有一个参数的函数fn(1)(2)(3)。

function fn(a){
    return fuction(b){
        return function(c){
            return a+b+c
        }
    }
}
fn(1)(2)(3)  //6

我们给fn(1)传入了一个参数,由于它内部返回了一个匿名函数,所以我们可以继续给它传递参数fn(1)(2),因为在匿名函数里面也返回了一个匿名函数所以可以继续传递参数fn(1)(2)(3)。

原理

我们想要实现一个通用的柯里化函数,需要以下几个条件:

  1. 需要一个函数fn作为参数
  2. 其次,可以获取到fn声明时的参数数量,通过fn.length属性获取
  3. 最后,判断返回接收剩余参数的新函数,或者返回fn执行结果,以及缓存已经固定的参数。通过fn.length、闭包和递归实现。
function currying(fn){
    // 返回一个函数
    return function curried(...args){
        // 判断当前参数是否收集完成
        if(args.length>=fn.length){
            // 收集完成,直接调用fn函数
            return fn(...args)
        }
        // 未收集完成,递归调用curried函数
        return (...nextArgs)=>curried(...args,...nextArgs)
    }
}
function mul(a,b,c,d){
    return a*b*c*d
}
console.log(currying(mul)(1)(2)(3)(4)) // 24