一段不太一样的科里化方法

248 阅读1分钟

大家对科里化都不陌生了,今天给大家分享一段不一样的科里化实现代码,并且支持不同的执行方式,可以一次传入所有参数,也可以分批次传入参数,且最终结果不受传入批次影响,希望对大家有帮助。

一、定义科里化方法

const curry = (fn, _rest = fn.length) => (...args) => args.length < _rest ?
        curry(fn.bind(this, ...args), _rest - args.length) :
        fn.apply(this, args);

方法curry接收两个参数,一个是调用curry后要执行的回调方法fn,另一个参数_rest为隐式计算出来的fn默认形参的个数,内部递归时_rest为默认形参个数减去已传入的实参个数。

二、使用科里化方法

const getResult = curry((x, y, z) => `${x} + ${y} - ${z} = ${x + y - z}`)

使用科里化方法的时候,只要传入回调函数,不用传入_rest的具体个数。内部通过已经传入的实参个数与默认的形参个数做对比,如果小于则继续递归调用curry方法,把已传入的实参通过bind绑定给fn,并把剩余个数作为_rest传入。如果实参传够了,把所有参数一并带入执行回调fn。

三、执行结果测试

console.log(getResult(3)(2)(1)) //3 + 2 - 1 = 4
console.log(getResult(3)(2, 1)) //3 + 2 - 1 = 4
console.log(getResult(3, 2)(1)) //3 + 2 - 1 = 4
console.log(getResult(3, 2, 1)) //3 + 2 - 1 = 4