柯里化的实现原理:
接下来我们就自己手动实现柯里化。
1.目标:编写一个
myCurring
的函数,参数接收一个函数,调用自动实现柯里化。
2.思路步骤:
- 创建一个名字为
myCurring
的函数,接受的参数为 那个需要变为柯里化的函数,这里用fn
表示 - 函数内部返回一个名字为
curried
的函数,接收参数的个数为fn
中参数的个数,这里使用剩余参数...args
接收 curried
函数内部 需要去判断当前已经接收的参数的个数,是否与参数本身需要接受的参数的个数一致了。 1. 如果当前传入的参数 大于等于 需要接受的参数的个数时,执行函数,返回fn.apply(this, args)
2. 如果不满足上述条件 ,也就是传入的参数没有达到要求的个数时,需要返回一个新函数 这里用curried2
表示,接收的参数为第一次接收的参数后剩下的参数,这里使用...arg2
表示。3. 接收到参数后curried2
函数执行,递归调用curried 函数,继续判断传入的参数的个数是否一致,一致则执行3.1的步骤,反之则继续递归调用curried
函数检查参数的一致性。- 调用
myCurring
函数,传入我们需要 柯里化的函数作为参数。
3.完整代码示例:
// 柯里化函数的实现 将 myCurrying 函数实现为自动柯里化函数functionmyCurrying(fn){returnfunctioncurried(...args){// 判断当前已经接收的参数的个数,是否与参数本身需要接受的参数的个数一致了// 1. 当前传入的参数 大于等于 需要接受的参数的个数时,执行函数if(args.length >= fn.length){returnfn.apply(this, args)}else{// 2.当前传入的参数,没有达到个数时,需要返回一个新的函数,继续来接收剩余的参数functioncurried2(...args2){// 接收到参数后,需要递归调用curried 来再一次检查函数参数的个数是否达标returncurried.apply(this, args.concat(args2))// concat方法用于拼接两个数组返回一个新数组}return curried2
}}}
4.检验代码的正确性,使用 myCurring 自动实现函数的柯里化
先看代码:
// 使用我们已经实现的柯里化的函数myCurring将sum函数进行柯里化转化functionsum(num1, num2, num3){return num1 + num2 + num3
}var result1 =sum(1,2,3)
console.log(result1)// 6var result2 =myCurrying(sum)// sum函数作为参数传入 myCurrying 函数中
console.log(result2(1,2,3))// 6
如上所示,
result1
和
result2
输出的结果都是6,证明我们实现了sum函数的柯里化。
本文转载自: https://blog.csdn.net/qq_49002903/article/details/124768045
版权归原作者 不一213 所有, 如有侵权,请联系我们删除。
版权归原作者 不一213 所有, 如有侵权,请联系我们删除。