函数柯里化是计算机科学的一个概念:指的是把接收多个参数的函数转化为接收单一参数的函数,返回一个函数去处理剩余的参数
例如
function sum(a,b,c){
return a+b+c;
}
var sum = a=>b=>c=>a+b+c;
ps:lodash中有curry这个柯里化函数
柯里化的作用:每次的传参在单一函数中进行处理,处理完后下一个函数使用处理后的结果和其他参数,符合单一职责原则(每个参数的处理放到一个函数中进行) SRP和逻辑复用
例如打印日志信息
var log1 = date => type => message => {
console.log([${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}][${type}]:[${message}]
);
console.log(‘执行’);
}
// 定制化一个函数 防止多次传参
var newLog = log1(new Date());
newLog(‘DEBUG’)(“查询轮播图的bug”)
newLog(‘DEBUG’)(“新增添加用户的功能”)
// 实现一个自动柯里化的函数 实现原理就是用闭包把传参进行保存 当传参数量满足要求就执行函数
function curry(fn,args){
// 获得函数需要的参数的长度 比如一个函数原来需要三个参数 柯里化后可以只传一个或两个
let leng = fn.length;
// 注意传空值的情况(args就是arguments的数组形式)
args = args || [];
return function(){
// 先进行参数拼接
let subArgs = args.slice(0);
// 拼接现有的所有参数得到函数所需的所有参数
for(let i=0;i<arguments.length;i++){
subArgs.push(arguments[i]);
}
// 当已经传入的参数大于等于需要传入的参数,直接执行函数
if(subArgs.length>=leng){
return fn.apply(this,subArgs);
}else{
// 不满足就递归返回柯里化函数,注意参数拼接
return curry.call(this,fn,subArgs)
}
}
}
// 也可以这么写
// function hyCurrying(fn){
// return function curried(...args){
// if(args.length>=fn.length){
// return fn.apply(this,args)
// }else{
// function curried2(...args2){
// return curried.apply(this,args.concat(args2))
// }
// return curried2
// }
// }
// }
// function sum(a,b,c){
// return a+b+c
// }
// console.log(curry(sum)(1)(2)(3))
// console.log(hyCurrying(sum)(1)(2)(3))