函数柯里化
定义
在计算机中,柯里化(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');