函数柯里化
对于一个函数:
function add(a,b,c){
return a + b + c
}
我们希望实现一个效果,我们希望有另外一个函数curryingAdd,使得curryingAdd(1,2,3),curryingAdd(1,2)(3),curryingAdd(1)(2,3)和add(1,2,3)的效果是等价的,即实现参数个数的任意化。这便是函数柯里化。
实现代码:
function currying(fn,...args){ if(fn.length <= args.length){ //fn.length返回的是fn函数定义的参数个数,即add函 //数的a,b,c三个参数,args.length是curring函数调用时传入的参数个数 return fn(...args) } return function(...args1){ return currying(fn,...args,...args1) } } function add(a,b,c){ return a + b + c } add(1,2,3) // 6 var curryingAdd = currying(add); curryingAdd(1)(2)(3) // 6 curryingAdd(1,2)(3) // 6 curryingAdd(1)(2,3) // 6
箭头函数简化写法:
var currying = (fn,...args) => (...args1) => {
if(fn.length <= args.length){
return fn(...args)
}
return currying(fn,...args,...args1)
}
function add(a,b,c){
return a + b + c
}
//调用时最后多一个()
currying(add)(1,2)(3)()// 6