JS函数的柯里化

104 阅读2分钟

维基百科关于柯里化名词解释

  • 在计算机科学中,柯里化(英语: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")