what?函数还有分期付款

思考

一个函数有多个形参,可以传入多个实参。例如以下这段函数

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

我们是如何调用这个函数的?

js 复制代码
add(1,2,3)//6

我们直接向函数中一次性传入三个形参,就像买东西一样,一次性付款,这样我们就成功地调用了add函数

但是如果我想分期付款呢?我将要传入的参数分3次分别传入,例如:

js 复制代码
add(1)(2)(3)

我还要让这个函数被成功地调用起来,我们该如何实现???

开始

1. 构想

在动手写代码之前,我们先来构想一下,我们需要用到什么来完成我们的代码。

  • Function.length

我们将多次传入参数,当我们传入足够的参数以后,才开始调用函数,所以我们究竟该怎么知道要传入几个参数呢?我们使用Function.length来获取

js 复制代码
console.log(add.length)//3
  • 闭包

我们是将参数分批传入函数的,所以我们还得在最后拿到我之前传入的参数,例如:

js 复制代码
add(1)(2)(3)

当我传入(3)的时候,我必须还得拿到(1)(2),那么我们就得使用到闭包了...有不太懂闭包的掘友们可以去看我之前的文章(深入探讨:闭包的神秘面纱 - 掘金 (juejin.cn))

2.动手

参考上面的思路,我们来完成我们的代码

js 复制代码
function curry(fn){
    let judge = (...args)=>{
        if(args.length === fn.length) return fn(...args) //退出条件
        return (...arg) => judge(...args,...arg)
    }
    return judge
}
const curryAdd = curry(add)
console.log(curryAdd(1)(2)(3));

当我们调用 curry 函数并传入一个函数 fn 时,curry 函数会返回一个新的函数 judge。这个 judge 函数可以接受任意数量的参数。

judge 函数内部,我们使用一个变量 args 来存储已经传入的参数。当我们调用 judge 函数并传入一些参数时,这些参数会被添加到 args 数组中。

然后,我们检查 args 数组的长度是否与原始函数 fn 的参数个数相等。如果相等,说明我们已经传入了所有需要的参数,此时我们直接调用原始函数 fn 并将 args 数组作为参数传递进去,并返回结果。

如果 args 数组的长度不等于 fn 的参数个数,那么我们就返回一个新的函数。这个新函数也是 judge 函数,并接受剩余的参数。我们使用扩展运算符 ...args 数组和剩余的参数合并起来,并递归调用 judge 函数。这样就可以继续接受更多的参数,直到参数个数满足条件。

看结果:

收工

这个方法也叫函数的柯里化,函数柯里化是一种将多个参数的函数转化为一系列只接受单个参数的函数的过程。这种实现方式可以使函数变得更加灵活,可以逐步传递参数,使代码更易读和可维护。

相关推荐
小码哥_常1 小时前
安卓黑科技:实现多平台商品详情页一键跳转APP
前端
killerbasd1 小时前
还是迷茫 5.3
前端·react.js·前端框架
不会敲代码12 小时前
TCP/IP 与前端性能:从数据包到首次渲染的底层逻辑
前端·tcp/ip
kyriewen2 小时前
奥特曼借GPT-5.5干杯,而你的Copilot正按Token收钱
前端·github·openai
AC赳赳老秦2 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
kyriewen2 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
不会敲代码12 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库实现语义搜索
javascript·openai
千寻girling3 小时前
《 Git 详细教程 》
前端·后端·面试
threelab3 小时前
Three.js UV 图像变换效果 | 三维可视化 / AI 提示词
javascript·人工智能·uv
之歆4 小时前
DAY08_CSS浮动与行内块布局实战指南(下)
前端·css