当前位置: 首页 > news >正文

JS手写代码篇---手写函数柯里化

13、手写函数柯里化

它将一个接受多个参数的函数转换为一系列只接受一个参数的函数

举个例子:

 function add(a, b) {return a + b;}console.log(add(2, 3)); // 输出:5// 柯里化后:function curriedAdd(a) {return function (b) {return a + b;};}const add2 = curriedAdd(2); // 固定第一个参数为 2console.log(add2(3)); // 输出:

柯里化

  • 传入:一个函数,但是有多个参数
  • 目的:就是把多个参数进行链式调用
        let currying = function (func) {// 参数// let args = [];//这样的话,每次调用currying,都会指向第一次的args// 返回函数进行链式调用,,也需要传递参数return function curried(...args) {// 每次链式调用都应该有自己的参数收集,可以这样递归实现:return function result(...res) {// 当res的长度为0(不调用参数的时候,就代表要执行函数)if (res.length === 0) {return func(...args)} else {// 当在执行函数之前,就要保存参数,进行链式调用args.push(...res);return result;}}}}

进行改进:

        // 柯里化函数:传入一个函数let currying = function (func) {// 开始递归返回函数// ...args可以收集函数return function curried(...args) {// 如果参数数量足够,执行原函数// 如果收集的函数参数大于等于了原函数的参数,就可以直接执行了if (args.length >= func.length) {return func.apply(this, args);}// 否则返回一个新函数继续收集参数// 当参数不足时,返回一个新函数继续收集参数// 新函数将之前收集的参数(args)与新传入的参数(newArgs)合并return function (...newArgs) {// 这里就是链式调用return curried.apply(this, args.concat(newArgs));};};};

我写的一些问题:

  1. 结构复杂:嵌套了两个函数(curried和result),逻辑不够直观
  2. 参数收集不完整:只收集了第二次及以后的参数,第一次调用的参数没有被收集
  3. 递归使用不当:result函数的递归调用方式不够优雅
  4. 链式调用逻辑有误:当传入空参数时才执行函数,这与柯里化的常见实现方式不同
http://www.xdnf.cn/news/912547.html

相关文章:

  • Dify中聊天助手、agent、文本生成、chatflow、工作流模式解读分析与对比
  • 【java】在springboot中实现证书双向验证
  • 告别繁琐配置:在线运行 Matplotlib 画图,Python 环境免安装新体验!
  • 嵌入(Embedding)技术的实现原理与应用场景解析
  • 基于KNN算法的入侵检测模型设计与实现【源码+文档】
  • vue3 按钮 增加快捷方式
  • 易思维报考上市:国投基金清仓退出,郭寅“套现”超6500万元
  • Gerrit相对Git提供了一个特有的命名空间“refs/for/”用来定义我们的提交上传到哪个branch
  • c++重点知识总结
  • win10/win11禁止系统更新
  • AI书签管理工具开发全记录(十三):TUI基本框架搭建
  • 辊式矫平机:金属板材平整加工的基石
  • @Minikube 部署与配置
  • ngx_stream_access_module基于 IP 的流式访问控制实践指南
  • C++.OpenGL (6/64)坐标系统(Coordinate Systems)
  • GPU纹理复用技术实战:显存占用狂降70%的革命性优化方案
  • C++ --- vector
  • MySQL 事务详解
  • CSS6404L 在物联网设备中的应用优势:低功耗高可靠的存储革新与竞品对比
  • 常用操作符,操作符相关笔试题(谷歌)及算法的优化
  • [蓝桥杯]整理玩具
  • 【乐企板式文件】货物运输类发票,多页支持
  • 爱普生研发全新恒温晶体振荡器 “省、小、精”加速通信产业释放新质动能!
  • Java并发编程实战 Day 12:阻塞队列与线程协作
  • 文件上传/下载接口开发
  • Python训练第四十六天
  • 将内网地址转换成外网地址,让局域网外也能访问本地服务资源
  • 第21讲、Odoo 18 配置机制详解
  • 双面沉金PCB应用:打造卓越电子设备的黄金工艺
  • Android第十四次面试总结