函数柯里化和组合函数的使用

一、函数柯里化(currying) 🐶

什么是函数柯里化,怎样让一个函数柯里化并且运用 ?

  1. 柯里化是指把接受多个参数的函数,变成 接受一个单一参数 (最初函数的第一个参数)的函数,返回结果是一个新函数的技术,并且该新函数可接受余下参数;

  2. 柯里化声称,如果固定某些参数,将接受余下参数的一个函数;

总结:只传递给函数 一部分参数 来调用它,让它返回一个函数去处理剩余的参数的过程,可见,柯里化主要处理多参数场景。

如下是自动柯里化函数的方法,调用之后可以对函数根据情况进行柯里化

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

使用场景:

  • 对于某些数据的复杂逻辑实现,可以将 众多功能拆分开,拆成对应的功能函数,处理特定的逻辑;
  • 复用,很多小功能函数可实现逻辑复用,精简代码;
相关推荐
LawrenceLan7 分钟前
Flutter 零基础入门(二十六):StatefulWidget 与状态更新 setState
开发语言·前端·flutter·dart
秋秋小事27 分钟前
TypeScript 模版字面量与类型操作
前端·typescript
2401_892000521 小时前
Flutter for OpenHarmony 猫咪管家App实战 - 添加提醒实现
前端·javascript·flutter
Yolanda941 小时前
【项目经验】vue h5移动端禁止缩放
前端·javascript·vue.js
广州华水科技2 小时前
单北斗GNSS形变监测一体机在基础设施安全中的应用与技术优势
前端
EndingCoder2 小时前
案例研究:从 JavaScript 迁移到 TypeScript
开发语言·前端·javascript·性能优化·typescript
阿珊和她的猫4 小时前
React 路由:构建单页面应用的导航系统
前端·react.js·状态模式
Amumu121384 小时前
Vue脚手架(二)
前端·javascript·vue.js
花间相见4 小时前
【LangChain】—— Prompt、Model、Chain与多模型执行链
前端·langchain·prompt
lichenyang4535 小时前
从零开始构建 React 文档系统 - 完整实现指南
前端·javascript·react.js