Skip to content

函数柯里化

定义

在计算机中,柯里化(currying)是把接受多个参数的函数变换为接受一个单一参数的函数,并且返回接受后续参数且返回结果的新函数的技术。

原函数和柯里化函数

javascript
//-------原函数---------
function add(a, b) {
  return a + b;
}
add(1, 2);


//-------柯里化函数---------
function curry(a) {
  return function (b) {
     return a + b;
  }
  
  curry(1)(2);
}

经典面试题

javascript
function add(a, b,c,d,e) {
  return a + b + c + d + e;
}
//改写为参数足够五个的时候累加
//1 2 3 4 5
//1 2,3  4 5
// 1  2,3,4  5
//1,2,3   4,5

思路实现

保存不定长参数

  • 是否达到长度
    • 否:保存参数,返回函数
    • 是:执行函数并返回结果
javascript
let nums = [];
function add(...args) {
  nums.push(...args);
  //判断参数个数shu 是否达到长度
  if (nums.length >= 5) {
    //长度到五个,执行函数并返回结果
    const res = nums.slice(0,5).reduce((acc,cur)=>acc+cur, 0 );
    nums = [];
  }else {
    //长度不到五个,返回函数
    return sum;
  }
}

代码优化

参数可自定义数量

添加参数量

javascript

function sumAdd(len) {
  let nums = [];
  function add(...args) {
    nums.push(...args);
    //判断参数个数是否达到长度
    if (nums.length >= len) {
      //长度足够,执行函数并返回结果
      const res = nums.slice(0,len).reduce((acc,cur)=>acc+cur, 0 );
      nums = [];
    }else {
      //数量不足,返回函数
      return sum;
    }
  }
return sun
}

函数柯里化-实际应用

参数服用 为函数预制通用参数,供多次调用使用。

javascript

function isUndefined(thing) {
  return typeof thing === 'undefined';
}

function isNumber(thing) {
  return typeof thing === 'number';
}

function isString(thing) {
  return typeof thing === 'string';
}

function isFunction(thing) {
  return typeof thing === 'function';
}



//-----柯里化--------------------
//改为typeOfTest 生成
const typeOfTest = function (type) {
  function test(thing) {
    return typeof thing === type;
  }
  return test;
}

//简化为箭头函数
//axios源码中工具类包 函数柯里化实例
const typeOfTest1 = type => thing => typeof thing === type;

const isUndefined = typeOfTest('undefined');