柯里化
//普通的纯函数
//这里写一个用于判断用户是否成年的普通纯函数
function checkAge(min,age){
return age >= min
}
console.log(checkAge(18,20))
console.log(checkAge(18,24))
console.log(checkAge(22,24))
//这里会发现 18作为一个基准值,经常被调用,那么怎么去减少这个值的调用呢
//这里我们可以使用 闭包 和高阶函数内记得技巧--将函数作为返回值
function checkAge(min){
return function(age){
return age >= min
}
}
//es6
//let checkAge = min =>(age => age>= min)
const check18 = function checkAge(18)
const check20 = function checkAge(20)
console.log(check18(22)) //true
console.log(check20(24)) //true
//其实这个解决方案就是柯里化
由上可知柯里化就是,当一个函数接受多个参数时,可以先传递一部分给他(这部分参数以后永远不变),然后返回一个新的函数接受剩余的参数,返回结果
Lodash中的柯里化
- curry(func)
- 当传递的参数是内部需要的所有的参数,会直接执行并返回执行结果
- 如果传递的参数是内部需要的部分参数,会返回内部函数并等待剩下的参数
const _ = require('lodash')
function getSum (a,b,c){
return a+b+c
}
const curried = _.curry(getSum)
console.log(curried(1,2,3))//6
console.log(curried(1)(2,3))//6
柯里化原理
function curry(func){
return function curriedFn(...args){
if(args.length < func.length){
return function(){//利用递归来传递合并参数
return curriedFn(...args.concat(Array.from(arguments)))
}
}
return func(...args)
}
}
总结
- 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数
- 这是一种对函数参数的缓存
- 让函数百年的更灵活,让函数的颗粒度更小
- 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能