作用
函数柯里化,用于创建一个函数,这个函数是已经设置好了一个或者多个参数引用红宝书
其实就是说当一个函数 ,有多个参数的时候,先传递一部分函数参数然后调用它,然后返回一个新的函数,这个函数接受剩余参数,然后返回计算结果;
价值
提高参数复用性,优化代码,看下面demo
假设有这样一个需求,需要计算x*y的返回值
// 非柯里化计算2*y
const fn = (baseNum, currentNum) => baseNum * currentNum;
// 2 *3
fn(2,3)
// 2*4
fn(2,3)
....
// 柯里化计算2*y
const fn = baseNum => currentNum => baseNum * currentNum;
const fn2 = baseNum(2)
//2*3
fn2(3)
//2*4
fn2(4)
....
看上面demo,2这个参数在非柯里化的时候重复出现,但是其实,这个参数完成是可以通过技术手法复用的就是柯里化,在柯里化之后,2这个参数就省略了
当然,现在有很多库都实现了柯里化函数比如 lodash中curry方法
为了跟好的理解,接下里啊模拟个curry方法
function curry (func) {
// 首先return一个函数
return function curriedFcuntion(...args) {
//通过解构,接受参数不确定的case
// 判断形参和实参的个数
//形参指的是传入的函数参数的个数,这里指的就是getSum这个函数的形参
// 获取函数形参,通过函数名.length方法获得
if (args.length < func.length) {
return function () {
return curriedFcuntion(...args.concat(Array.from(arguments)))
}
}
// 也可以使用 func.apply(this,[...args])
return func(...args )
}
}
//测试下
function addSum (a, b, c) {
return a + b + c
}
const curried = curry(addSum)
console.log(curried(1, 2, 3))
console.log(curried(1)(2, 3))
console.log(curried(1, 2)(3))
//6
//6
//6
总结
1、柯里化是对函数参数的一种缓存
2、使函数的颗粒度细腻
3、可以使多元函数转换成一元函数,进而组合使用生产更强大的函数