JS 柯里化

114 阅读1分钟

什么是柯里化( curry)

举例来说,一个接收3个参数的普通函数,在进行柯里化后, 柯里化版本的函数接收一个参数并返回接收下一个参数的函数, 该函数返回一个接收第三个参数的函数。 最后一个函数在接收第三个参数后, 将之前接收到的三个参数应用于原普通函数中,并返回最终结果。

//普通函数 
function fn(a,b,c,d,e) {
    console.log(a,b,c,d,e) 
} 

//生成的柯里化函数 
let _fn = curry(fn);  // curry 待实现柯里化函数

// 所得到的效果
_fn(1,2,3,4,5); // print: 1,2,3,4,5 
_fn(1)(2)(3,4,5); // print: 1,2,3,4,5 
_fn(1,2)(3,4)(5); // print: 1,2,3,4,5 
_fn(1)(2)(3)(4)(5); // print: 1,2,3,4,5
  

实现柯里化函数

/**
 * 将函数柯里化
 * @param fn    待柯里化的原函数
 * @param len   所需的参数个数,默认为原函数的形参个数
 */
function curry(fn,len = fn.length) {
  return _curry.call(this,fn,len)
}

/**
* 中转函数
* @param fn    待柯里化的原函数
* @param len   所需的参数个数
* @param args  已接收的参数列表
*/
function _curry(fn,len,...args) {
  // return ()=>{}
  return function (...params) {
      let _args = [...args,...params];
      if(_args.length >= len){
          return fn.apply(this,_args);
      }else{
          return _curry.call(this,fn,len,..._args)
      }
  }
}

tips: 常用的工具库 lodash 也提供了 curry 方法