今天我们聊聊JavaScript中的函数柯里化

序言

今天呢我们要来聊的是在JS中一种灵活处理函数的方式,在生活中,假如一位高级的厨师想要烹饪出一道美味佳肴,料理的添加顺序肯定不是一次性的,而是有规律且分布进行添加的。

欸,对比之下,有时候我们编程也是如此,如果一个函数需要接收n个参数才能返回最终结果,且无法一次性接收全部参数。

我们有办法吗?有!

在JavaScript中,就有一个这样隐藏在幕后的编程魔法------函数柯里化(Currying)。搞懂了这项技能,当我们处理函数时就能更加得心应手,就像调料师傅逐滴调出完美的酱汁一样。

那么现在就让我们一起踏上这场风格欢快的探险,解锁函数柯里化的神奇之谜!

理解基础:add函数

首先,让我们先来看一下我们今天要进行柯里化的基础函数:add。这个函数非常简单,它接受三个参数,并返回它们的和。

js 复制代码
function add(a, b, c) {
    return a + b + c;
}

然后,我们需要思考一个问题:你知道如何拿到这个函数接收参数的个数吗?

答案就是: fn.length

比如我们这里打印一下add.length

js 复制代码
console.log(add.length); // 3

这样我们就拿到了这个函数接收的参数个数为3,这一步为我们后续柯里化函数的终止条件做了铺垫。

柯里函数的秘密

接下来呢,我们就需要请出今天内容的神秘的向导------curry函数。它的任务是将函数柯里化,就像一位魔法导师把法术传授给学徒一样。

js 复制代码
function curry(fn) {
    let judge = (...args) => {
        if (args.length === fn.length) {
            return fn(...args);
        } else {
            return (...arg) => judge(...args, ...arg);
        }
    }
    return judge;
}

代码解释

  1. 首先,我们定义了一个函数 curry ,该函数接受一个参数 fn,表示要进行柯里化的原函数。

  2. 接着我们在函数内部定义一个新函数judge,并且使用剩余参数(rest parameters)语法,代表该函数可以接受任意数量的参数,这些参数会被存储在一个数组 args 中。

  3. 然后我们进行判断,当数组args的长度等于 fn.length 。直接调用原函数 fn,并传入所有参数,然后返回结果。

  4. 否则,我们返回一个新的函数,该函数将接收到的到的参数收集到一个名为 arg 的数组中,并通过递归调用内部函数 judge 来累积参数。

简单来说就是:

  • ...args 代表收集的当前调用 judge 函数时传递的参数。
  • ...arg 代表收集的传递给它的任何新参数。它会展开由剩余参数收集的参数数组中的元素。

直到满足上面if中的条件。也就是接收到的参数数量等于原函数 fn 的参数数量,然后调用原函数,最后返回judge。

应用柯里化到add函数

现在呢,我们完成了以上步骤,就可以开始将curry函数应用到add函数上了,于是乎我们得到了一个新的柯里化版本的函数curryAdd

js 复制代码
const curryAdd = curry(add);

最后,我们通过调用curryAdd(1)(2)(3)来演示柯里化的实际应用,结果输出不出意外,果然是6

总结

我们进行这一连串的调用过程其实就是在逐步地向函数传递参数。首先,curryAdd(1)返回一个新的函数,接着(2)返回另一个函数,最后(3)调用原始的add函数,将所有参数相加。结果6被打印到控制台。

函数柯里化是JavaScript中一个强大的编程技术,它使得函数调用更加灵活,允许我们根据需要逐步传递参数。通过本文的分析,我们深入理解了柯里化的工作原理,并了解了如何应用它来提高代码的可读性和复用性。在实际的项目中,函数柯里化可以成为编写更加优雅和模块化代码的有力工具。

那么到了这里我们今天的文章就结束啦~

创作不易,如果感觉这个文章对你有帮助的话,点个赞吧♥

更多内容【AIGC】如何使用Autogen库打造智能对话体验?请看保姆级教学

ReacheMe : GitHub Gitee

相关推荐
_阿南_4 小时前
项目中新增给AI制定的代码规范
前端·程序员
名字还没想好☜4 小时前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
自动化监测Learner5 小时前
主流 Web 端地图引擎对比:选型指南与优劣分析
javascript
console.log('npc')6 小时前
Git 冲突与 AI 协助指南
前端·人工智能·git·大模型
黄敬峰6 小时前
一文搞懂 LLM 流式输出与 SSE
面试
爱学堂IT分享7 小时前
Cesium可视化系统实战课程-Cesium教程学习
前端
糖墨夕7 小时前
理解大语言模型:Agent 的“大脑”
前端·agent
Rain的Java大神之路7 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
cpolar技术支持8 小时前
浏览器也能跑本地 AI:用 Transformers.js + WebGPU 做一个最小推理 Demo,cpolar 给同事远程体验
前端·ai·cpolar·webgpu·transformers.js
职场的momo8 小时前
字节生活服务海量内推,挑战亿级订单与AI交易中台
人工智能·程序人生·面试·职场和发展·跳槽·生活·业界资讯