什么是函数柯里化?
在计算机科学中,柯里化(英語:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
通俗点讲就是,把一个接受多参数的函数分解为可以把参数进行分解,分开执行。
function sum(a,b,c) {
return a + b + c
}
function curry(func){
}
const sum2 = curry(sum)
sum2(1,2,3)
sum2(1)(2)(3)
sum2(1,2)(3)
sum2(1)(2,3)
看上面这个例子,原本sum函数是接受3个参数的,经过柯里化之后,可以变成3个参数依次执行,也可以第一次执行1个参数,第二次再执行剩余的参数。(其实维基百科上的定义比较严格,这里我们不纠结这个了)
函数柯里化有什么好处?
- 参数复用,或者说是固定参数,避免重复传参;
- 提前返回,或者说是提前确认,避免重复判断;
- 延迟执行。
对于一个多参数函数来说,如果我们有一个需求是,在多次执行这个函数的时候,我们输入的第一个参数都相同,这样我们可以利用函数柯里化,把执行了第一个参数的结果给保存下来,这样就不用每次执行的时候,都输入全部的参数了,可以简化过程,避免重复传参。
还是上面那个例子,如果说我们对于第一个参数的输入有要求,这样我们可以提前验证,避免重复判断。
函数柯里化实现
实现的关键在于,当前函数的参数数量与原先函数的参数数量是否相等,如果相等的话,直接执行函数,并且输出结果,如果当前函数的参数数量小于原先函数的参数数量的话,需要返回一个接受了部分参数的函数。
function curry(func) {
return function step(...args1){
if(func.length <= args1.length){
return func(...args1)
}else{
return function(...args2){
return step(...args1,...args2)
}
}
}
}
const curry = (func) => step = (...args1) => {
func.length <= args1.length ? func(...args1) : (...args2) => step(...args1,...args2)
}