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

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

使用场景:

  • 对于某些数据的复杂逻辑实现,可以将 众多功能拆分开,拆成对应的功能函数,处理特定的逻辑;
  • 复用,很多小功能函数可实现逻辑复用,精简代码;
相关推荐
滚雪球~35 分钟前
npm error code ETIMEDOUT
前端·npm·node.js
沙漏无语37 分钟前
npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
supermapsupport38 分钟前
iClient3D for Cesium在Vue中快速实现场景卷帘
前端·vue.js·3d·cesium·supermap
brrdg_sefg40 分钟前
WEB 漏洞 - 文件包含漏洞深度解析
前端·网络·安全
胡西风_foxww1 小时前
【es6复习笔记】rest参数(7)
前端·笔记·es6·参数·rest
m0_748254881 小时前
vue+elementui实现下拉表格多选+搜索+分页+回显+全选2.0
前端·vue.js·elementui
ThisIsClark1 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
星就前端叭2 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
m0_748234522 小时前
前端Vue3字体优化三部曲(webFont、font-spider、spa-font-spider-webpack-plugin)
前端·webpack·node.js
Web阿成2 小时前
3.学习webpack配置 尝试打包ts文件
前端·学习·webpack·typescript