维基百科关于柯里化名词解释
- 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化。
- 是把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术。
- 柯里化声称 “如果你固定某些参数,你将得到接受余下参数的一个函数”。
名词解释总结
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数,这个过程就称之为柯里化。
函数柯里化的代码
这里sumKe就是sum1的柯里化实现
//代码1
function sum1(x,y,z){
return x + y + z
}
function sumKe(x){
return function(y){
return function(z){
return x + y + z
}
}
}
let result = sumKe(10)(20)(30)
console.log(result);
使用箭头函数简化sumKe
// 使用箭头函数简化
let sum = x=> y=> z=>{
return x + y +z
}
函数柯里化的好处
职责单一
- 在函数式编程中,我们往往希望一个函数处理的问题竟可能的单一,而不是讲一大堆的过程交给一个函数来处理。要符合设计模式中的单一职责原则。
- 我们可以将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果。 我们对上面的代码1做一个修改,传入的参数分别‘x + 2’ ,'y * 2', 'z ** 2(z的平方)'
let sum = x => {
x += 2;
return y=>{
y *= 2;
return z=>{
z **= 2
return x + y + z
}
}
}
console.log(sum(1)(2)(3)); //16
使用柯里化就可以让程序变得更加有层次
逻辑复用
我们来看下面的两个代码 复用的代码1
//假如在程序中,我们经常需要把5和另外一个数字相加
function makeAdder(count){
return function (num){
return count + num
}
}
var result = makeAdder(5)(10)
console.log(result)
var adder5 = makeAdder(5)
adder5(10) //这也是一样的,这里是对count做了一个复用
复用的代码2
// function log(date,type,message){
// console.log(`[${date.getHours()}:${date.getMinutes()}][${type}]:[${message}]`);
// }
// log(new Date(),"Debug","查询轮播图的bug")
// log(new Date(),"Debug","查询菜单的bug")
// log(new Date(),"Debug","查询数据的bug")
//柯里化的优化
var log = date => type => message =>{
console.log(`[${date.getHours()}:${date.getMinutes()}][${type}]:[${message}]`);
}
//如果我现在打印的都是当前时间
var nowLog = log(new Date())
nowLog("Debug")("查找轮播图的bug")
nowLog("Feature")("新增了添加用户的功能")
var nowAndDebug = log(new Date())("Debug")
nowAndDebug("首页的bug")