手写函数柯里化(Curry)--原理剖析

2023-11-06

函数柯理化的作用

前端使用柯里化的用途主要就是简化代码结构,提高系统的维护性,一个方法,只有一个参数,强制了功能的单一性,很自然就做到了功能内聚,降低耦合。

函数柯理化的优点

降低代码的重复,提高代码的适用性。 (在后面实现应用部分 ajax 会体现出来调用时的代码精简)

函数柯理化的实现

调用形式

function add(a,b,c,d){
  return a + b + c + d;
};
var newAdd = Curry(add);    //将add函数柯里化  经过柯理化返回一个新的函数
//柯里化之后的newAdd函数执行方式,传入剩余的参数。
newAdd(1)(2)(3)(4);  
newAdd(1,2)(3,4);
newAdd(1,2,3)(4);
newAdd(1,2,3,4);
newAdd(1)(2,3,4);
newAdd(1)(2,3)(4);

函数柯理化的准备

//柯里化就是期望下一次能够把所有的参数传入完毕。
function FixedParamsCurry(fn){
  //arguments=[add,1,2]
  var _arg = [].slice.call(arguments, 1);
  return function(){
    //arguments=[2,3]
    var newArg = _arg.concat([].slice.call(arguments, 0));
    return fn.apply(this, newArg);
  }
}                
var newAdd = FixedParamsCurry(add,1);  //传入参数。这里是传入了1个参数
console.log(newAdd(2,3,4));   //此处必须要将剩余的参数填满。这里将剩余的3个参数传入。(期望这一次把参数全部传入完毕)   

柯理化的具体实现
期待下一次将参数补齐

function Curry(fn, length){
  // fn.length返回的是该函数需要的参数的个数
  var length = length || fn.length;
  return function(){
    if(arguments.length < length){
      //[fn, 1]
      var combined = [fn].concat([].slice.call(arguments, 0));
      return Curry(FixedParamsCurry.apply(this, combined), length-arguments.length);   //用到的递归和闭包
      //直到当参数完全和执行函数的形参一样的时候,才会执行功能。
    }else{
      return fn.apply(this, arguments);
    }
  }
}

函数柯理化的应用

//此处ajax只是示意而已
//POST www.test1.com 'name=djl&age=22'
//POST www.test1.com 'key=111'
//POST www.test2.com 'name=djl&age=22'
//POST www.test2.com 'key=222'
function ajax(method, url, data){
  console.log(method, url, data);
}
 
//场景:参数的代码重复性太高,每次都要写重复的参数
ajax('POST', 'www.test1.com', 'name=djl&age=22');
ajax('POST', 'www.test1.com', 'key=111');
ajax('POST', 'www.test2.com', 'name=djl&age=22');
ajax('POST', 'www.test2.com', 'key=222');
 
//使用柯里化简化代码:针对‘POST’的参数传入省略
var ajaxCurry = Curry(ajax);
var postAjax = ajaxCurry('POST');
postAjax('www.test1.com', 'name=djl&age=22');
postAjax('www.test2.com', 'name=djl&age=22');
 
//还可以再继续细分,针对域名‘www.test1.com’省略参数
var test1PostAjax = Curry(postAjax);
test1PostAjax('name=djl&age=22');
test1PostAjax('key=111');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手写函数柯里化(Curry)--原理剖析 的相关文章

随机推荐

  • 购物车订单、订单项逻辑分析

    参考 http how2j cn k cart cart tutorials 595 html 1 Order 订单 2 OrderItem 订单项 订单项和订单的关系 多对一 一个订单里有多条订单项 一个订单项 只会出现在一个订单里 以下
  • React—生命周期

    0x00 前言 CTF 加解密合集 CTF Web合集 网络安全知识库 溯源相关 CISP汇总 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 生命周期 1 基本概念 当Clock组件第一次被渲染到DOM的时候 为其
  • I2C之知(六)--s3c2440用I2C接口访问EEPROM

    在前面阅读理解了I2C的官方协议文档后 就拿s3c2440和EEPROM来验证一下 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的 但在没有示波器的情况下搞了一周 怎么都出不来 最后还是放弃了 甚至参考了linux下i2
  • BurpSuite2021 -- Intruder模块

    真正爱上一个人的感觉 就是别人再好与我无关 承蒙你的出现 足够让我欢喜一辈子 网易云热评 一 Target 目标 当我们抓到数据包 右击发送到Intruder模块 这里会自动填写好信息 二 设置爆破模式即参数 1 Sniper 对变量进行依
  • 类模板的定义和使用注意事项。

    include iostream include string using namespace std 类模板 设置了默认数据类型 如 template
  • MATLAB代码:基于二阶锥优化电气综合能源系统优化调度研究

    MATLAB代码 基于二阶锥优化电气综合能源系统优化调度研究 关键词 电气综合能源 优化调度 二阶锥优化 参考文档 考虑气电联合需求响应的气电综合能源配网系统协调优化运行 参考部分配电网设备模型 非完全复现 以文档为准 仿真平台 MATLA
  • 【C++】一文详解lambda表达式用法及发展历程

    文章目录 1 lambda表达式语法 2 捕获列表 2 1 作用域 2 2 捕获值与捕获引用 2 3 特殊捕获方法 3 lambda表达式实现原理 4 无状态lambda表达式 5 在STL中使用lambda表达式 6 广义捕获 7 泛型l
  • 域名系统中的本地域名服务器、根域名服务器、顶级域名服务器以及权限域名服务器。

    根域名服务器 是最高层次的域名服务器 也是最重要的域名服务器 所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址 顶级域名服务器 这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名 权限域名服务器 负责一个区的域名服务器
  • 资源服务器验证Token的几种方式

    资源服务器验证Token的几种方式 在微服务中 除了eureka config 网关等基本的微服务还有认证服务和资源服务 上图描述了使用了 OAuth2 的客户端请求验证token的流程 是通过资源服务向认证服务验证token 过程就是客户
  • 消息队列原理及选型

    什么是消息队列 消息队列 Message Queue 是一种进程间通信或同一进程的不同线程间的通信方式 什么时候需要消息队列 异步处理 例如短信通知 终端状态推送 App推送 用户注册等 有些业务不想也不需要立即处理消息 消息队列提供了异步
  • Redis主从复制架构和Sentinel哨兵机制

    一 redis主从复制原理 redis主从同步策略 slave刚加入集群会触发一次全量同步 全量复制 全量同步之后 进行增量复制 slave优先是增量同步 如果增量同步失败会尝试从master节点进行全量复制 全量复制 slave初始化阶段
  • 华为OD机试真题- 数值同化-2023年OD统一考试(B卷)

    题目描述 存在一个m n的二维数组 其成员取值范围为0 1 2 其中值为1的元素具备同化特性 每经过1S 将上下左右值为0的元素同化为1 而值为2的元素 免疫同化 将数组所有成员随机初始化为0或2 再将矩阵的 0 0 元素修改成1 在经过足
  • IDEA连接SSH以及上传项目文件到指定远程服务器文件夹

    一 IDEA连接SSH 确认你的密码输对了 还好我保存了我的远程服务器的密码 原先我一直以为我输对了 导致一直报错Auth fail 点击ok 连接上了 二 将项目文件传输到 远程服务器的指定文件夹 name随意起个名字 1 是你的本地项目
  • 什么叫异步通信?同步通信与异步通信的区别是什么?

    异步通信 又称为起止式异步通信 数据帧与数据帧之间没有固定时间间隔约定 可以是不定时长的 空闲位 异步通信是在内部约定好时钟 芯片设计设定好的时钟 用起始位开头 中间包含数据位后面随效验位和停止位的格式 我们称之为 帧 整个数据帧的位组成是
  • 【云服务器】阿里云服务器部署web项目前的准备(安装Nginx,jdk,Tomcat,MySQL)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 首先得有一台云服务器 白嫖党可以去看看鱼皮的视频或者百度搜索如何白嫖阿里云服务器 二 安装nginx反向代理服务器 二 Jdk和Tomcat的安装 1 jdk
  • 集团服务器 系统,开创集团云服务器

    开创集团云服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 本节操作介绍通过华为云APP连接Linux实例的操作步骤
  • umi搭建的react项目——如何mock数据

    umi搭建的react项目 如何mock数据 1 本地配置打开 本地配置umirc local ts中的mock配置打开 export default defineConfig mock 2 配置接口 在项目配置接口的文件中添加接口 例如
  • eclipse 设置系统变量和运行参数

    在开发时 有时候可能需要根据不同的环境设置不同的系统参数 我们都知道 在使用java jar命令时可以使用 D参数来设置运行时的系统变量 同样 在Eclipse中运行java程序时 我们怎么设置该系统变量呢 另外 如果我们的程序需要输入运行
  • mysql 游标

    who 游标是什么 游标 cursor 官方定义 是系统为用户开通的一个数据缓冲区 存放sql执行结果 每个游标区都有一个名字 用户可以通过sql语句逐一从游标中获取记录 并赋值给变量 交由主语言进一步处理 个人理解 感觉游标和指针相似 指
  • 手写函数柯里化(Curry)--原理剖析

    函数柯理化的作用 前端使用柯里化的用途主要就是简化代码结构 提高系统的维护性 一个方法 只有一个参数 强制了功能的单一性 很自然就做到了功能内聚 降低耦合 函数柯理化的优点 降低代码的重复 提高代码的适用性 在后面实现应用部分 ajax 会