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