柯里化函数概念就是将一个多参数的函数 转化为单一参数的函数;
举个栗子
function add(a,b,c){
return a + b + c;
}
现在需要让这个函数能够实现这么调用 add(1)(2)(3)或者add(1,2)(3) 或者add(1,2,3)
使用curry函数对这个函数进行柯里化
function curry(func){ let argLength = func.length; // 获取函数参数的个数 let curried = (...args) => { // 需要把参数凑齐了 才能执行传入的func函数 ,最终要返回 func(...args) // 所以当参数不够的时候继续执行柯里化,收集参数 if(args.length < argLength) { // 收集参数 return (...rest) => curried(...args, ...rest) }else { // 参数齐了 执行func return func(...args) } }
// 返回这个函数
return curried
}
测试:
let add2 = curry(add) console.log(add2(1, 2)(3)) // 6 console.log(add2(1)(2)(3)) // 6
然后我们看到很多地方有箭头函数连续写的
例如let func = a => b => c => {return a+b+c}
其实就是一个柯里化的过程,是属于es6的多次柯里化过程
let func2 = a => (b,c) => (de) => { return a + b +c +de}
调用
func(1)(2)(3)
func2(1)(2,3)(4)
但是我们可以将前两次传参存给一个变量, 这样 最后一次我们再传参再决定求值
例如
let add3 = func(3)
let add4 = add3(1)
现在我们重新定义了两个函数,任何数和add3或者add4相加
add3(3) // 6
add4(4) // 8
所以我们得出以下结论
柯里化函数的功能
- 可以惰性求值
- 可以提前传递部分参数