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

一、函数柯里化(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

使用场景:

  • 对于某些数据的复杂逻辑实现,可以将 众多功能拆分开,拆成对应的功能函数,处理特定的逻辑;
  • 复用,很多小功能函数可实现逻辑复用,精简代码;
相关推荐
梦6503 分钟前
基于 Vue3 + TypeScript 封装 UEditor 富文本编辑器组件
前端·vue.js·typescript
沛沛老爹4 分钟前
从Web开发到AI应用——用FastGPT构建实时问答系统
前端·人工智能·langchain·rag·advanced-rag
锥锋骚年4 分钟前
Vue 3 Vben Admin 框架的Mention提及组件
前端·javascript·vue.js
QT 小鲜肉4 分钟前
【Linux命令大全】001.文件管理之mlabel命令(实操篇)
linux·运维·服务器·前端·笔记
七月巫山晴6 分钟前
【iOS】OC中的一些宏
前端·ios·objective-c
elangyipi1236 分钟前
从嵌套依赖到符号链接:4款主流npm包管理器的架构演进与深度对比
前端·架构·npm
武帝为此12 分钟前
【Shell脚本函数介绍】
前端·chrome
南山安9 小时前
JavaScript 函数柯里化:从入门到实战,一文搞定(面试可用)
javascript·面试·函数式编程
谢尔登9 小时前
Monorepo 架构
前端·arcgis·架构
栀秋6669 小时前
你会先找行还是直接拍平?两种二分策略你Pick哪个?
前端·javascript·算法