定义
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
这是维基百科对柯里化的定义,听起来是不是有点难懂,让我们用代码演示一下吧:
function foo(m,n,x,y){
return m+n+x+y
}
foo(10,20,30,40)
//柯里化转化为:
function bar(m){
return function(n){
return function(x){
return function(y){
m+n+x+y
}
}
}
}
bar(10)(20)(30)(40)
//简化柯里化代码
var sum3 = x => y => z => x+y+z
这样写是不是非常繁琐?我们可以使用ES6推出的箭头进行简化:
//简化柯里化代码
var sum3 = x => y => z => x+y+z
柯里化的优势
看到这里我们就大致了解了函数柯里化的过程,但是可以看到即使使用箭头函数简化之后的代码,相比于原来的代码也不占优势(可读性差),那么我们为什么要使用函数柯里化呢?
柯里化的作用和好处:
使得一个函数处理问题尽可能的单一、简单,而不是一大推处理过程交给一个函数来处理,并且可以复用和定制化,当我们看代码感受一下吧。
let log = date => type => message => {
console.log(`[${date.getHours()}:${date.getMinutes()}][${type}]:[${message}]`);
}
let nowLog = log(new Date())
nowLog('DEBUG')('查找到路由模块的bug')
nowLog('FETURE')('添加了新的功能')
let nowAndDebugLog = log(new Date())("DEBUG")
nowAndDebugLog("找到了bug")
let nowAndFutureLog = log(new Date())("FETURE")
nowAndFutureLog("添加了新的功能")
总结
柯里化就是将多参函数转变为单参函数的过程,过程中将固定的参数先传入使用,其本质就是将某个操作中已完成的结果保留,直到其余部分后续也完成后可以一并提供的机制,通过在一个函数中返回另一个函数来进行实现。