柯里化
柯里化是一种处理多元函数的方法,它产生一系列连锁函数,其中每个函数固定部分,并返回一个新函数,用于传回其他剩余函数的功能。
经典的三数求和案例:
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)。
原理
我们想要实现一个通用的柯里化函数,需要以下几个条件:
- 需要一个函数fn作为参数
- 其次,可以获取到fn声明时的参数数量,通过fn.length属性获取
- 最后,判断返回接收剩余参数的新函数,或者返回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