一、函数柯里化(currying) 🐶
什么是函数柯里化,怎样让一个函数柯里化并且运用 ?
-
柯里化是指把接受多个参数的函数,变成 接受一个单一参数 (最初函数的第一个参数)的函数,返回结果是一个新函数的技术,并且该新函数可接受余下参数;
-
柯里化声称,如果固定某些参数,将接受余下参数的一个函数;
总结:只传递给函数 一部分参数 来调用它,让它返回一个函数去处理剩余的参数的过程,可见,柯里化主要处理多参数场景。
如下是自动柯里化函数的方法,调用之后可以对函数根据情况进行柯里化:
scss
/**
* 函数自动柯里化,该方法入参的函数必须是显示定义的参数个数,不能用于使用 "...args" 定义的函数
* @param {需要柯里化函数} func
* @returns 新的函数
*/
const currieFunc = (func) => {
if (typeof func !== 'function') {
return null;
}
/** 获取对应函数的参数个数 */
const funcParamLen = func.length;
const currieResult = (...parmas) => {
const paramLen = parmas.length;
/** 判断当前参数是否达到了原函数的参数个数 */
if (paramLen < funcParamLen) {
/** 如果总的参数还没有达到原函数参数个数, 则继续返回函数继续调用 */
return (...newParams) => currieResult(...parmas, ...newParams);
} else {
/** 如果传入参数达到了规定的参数, 直接调用函数 */
return func.apply(this, parmas);
}
};
return currieResult;
};
/** 多参数测试函数 */
const testFunc = (a, b, c, d, e) => {
return a + b + c + d + e;
}
/** 将函数柯里化 */
const currieDemo = currieFunc(testFunc);
/** 执行示例 1 */
const result1 = currieDemo(1, 2)(3)(6)(25);
console.log(result1); // 37
/** 执行示例 2 */
const result2 = currieDemo(1, 2, 7)(3)(6);
console.log(result2); // 19
/** 执行示例 2 */
const result3 = currieDemo(1, 2, 7, 9)(12);
console.log(result3); // 31
函数柯里化使用场景
-
让函数的职责更加单一,而不是将一大堆逻辑讲给一个函数来处理;
-
提高函数复用逻辑,对于那种某个参数可能固定入参的场景,可以先固定住某个参数,后续直接使用;
缺点:使用到了闭包,实际上参数被封存起来了,会造成内存泄露,实际使用时需要注意;
二、组合函数 (Compose Function)🥳
什么是组合函数,组合函数和函数柯里化又有什么区别
✍ 概念:组合函数是开发中一种对函数的使用技巧、模式。比如对 某些数据 进行 函数调用,需要执行多个函数,这些函数需要依次执行,将这些函数组合起来,自动依次调用,这个过程就叫做函数的组合,组合形成的函数就叫做组合函数,调用组合函数会返回一个新函数,新函数参数为需要处理的 某些数据。
总结:将一些函数按照对应的执行顺序组合起来,可让其依次执行的函数,就是组合函数,由此可见,组合函数主要用来处理多函数有顺序调用的问题。
如下是组合函数的实现,可将一系列函数组合起来,按照顺序执行。compose 函数为自动化组合函数,可让多个函数顺序执行,如下func1、func2、func 为需要将某些数据做一系列处理的函数。
ini
/**
* 将多个函数按照顺序组合执行, 构建组合函数
* @param {...any} 函数列表
* @returns 处理数据的函数
*/
const compose = (...args) => {
const funcArgs = args.slice();
/** 将函数按照入参顺序依次执行 */
return (...param) => funcArgs.reduce((preParam, nextFunc, index) => {
if (typeof nextFunc === 'function') {
/** 第一个处理可能的多参数 */
if (index === 0) {
return nextFunc(...preParam);
}
return nextFunc(preParam);
} else {
throw new Error('some param is not function');
}
}, param);
};
const func1 = (a, b) => a + b;
const func2 = (b) => b * 12;
const func3 = (c) => c - 20;
const comp = compose(func1, func2, func3);
const result = comp(1, 3);
console.log(result); // 28
使用场景:
- 对于某些数据的复杂逻辑实现,可以将 众多功能拆分开,拆成对应的功能函数,处理特定的逻辑;
- 复用,很多小功能函数可实现逻辑复用,精简代码;