手写js---实现函数柯里化

174 阅读2分钟

什么是函数柯里化?

计算机科学中,柯里化(英語: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)
}