JavaScript函数柯里化的实现原理,进来教你完成一个自己的自动实现柯里化方法

柯里化的实现原理:

接下来我们就自己手动实现柯里化。

1.目标:编写一个myCurring的函数,参数接收一个函数,调用自动实现柯里化。
2.思路步骤:
  1. 创建一个名字为myCurring的函数,接受的参数为 那个需要变为柯里化的函数,这里用fn 表示
  2. 函数内部返回一个名字为 curried 的函数,接收参数的个数为 fn 中参数的个数,这里使用剩余参数 ...args 接收
  3. curried 函数内部 需要去判断当前已经接收的参数的个数,是否与参数本身需要接受的参数的个数一致了。
    1. 如果当前传入的参数 大于等于 需要接受的参数的个数时,执行函数,返回fn.apply(this, args)
    2. 如果不满足上述条件 ,也就是传入的参数没有达到要求的个数时,需要返回一个新函数 这里用curried2表示,接收的参数为第一次接收的参数后剩下的参数,这里使用...arg2 表示。
    3. 接收到参数后 curried2 函数执行,递归调用curried 函数,继续判断传入的参数的个数是否一致,一致则执行3.1的步骤,反之则继续递归调用 curried函数检查参数的一致性。
  4. 调用myCurring 函数,传入我们需要 柯里化的函数作为参数。
3.完整代码示例:
// 柯里化函数的实现  将 myCurrying 函数实现为自动柯里化函数
function myCurrying (fn) {
    return function curried (...args) {
        // 判断当前已经接收的参数的个数,是否与参数本身需要接受的参数的个数一致了
        // 1. 当前传入的参数 大于等于 需要接受的参数的个数时,执行函数
        if (args.length >= fn.length) {
            return fn.apply(this, args)
        } else {
            // 2.当前传入的参数,没有达到个数时,需要返回一个新的函数,继续来接收剩余的参数
            function curried2 (...args2) {
                // 接收到参数后,需要递归调用curried 来再一次检查函数参数的个数是否达标
                return curried.apply(this, args.concat(args2)) // concat方法用于拼接两个数组返回一个新数组
            }
            return curried2
        }
    }
}
4.检验代码的正确性,使用 myCurring 自动实现函数的柯里化

先看代码:

//  使用我们已经实现的柯里化的函数myCurring将sum函数进行柯里化转化
function sum (num1, num2, num3) {
    return num1 + num2 + num3
}

var result1 = sum(1, 2, 3)
console.log(result1) // 6
var result2 = myCurrying(sum) // sum函数作为参数传入 myCurrying 函数中
console.log(result2(1, 2, 3)) // 6

如上所示,result1result2 输出的结果都是6,证明我们实现了sum函数的柯里化。

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不苒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值