函数柯里化

/*
 * @Description: 
 * @Autor: zhangbing
 * @Date: 2021-08-05 17:28:54
 * @LastEditors: zhangbing
 * @LastEditTime: 2021-08-06 12:05:15
 */

/**
 * 
 * @param {*} fn 柯里化绑定的函数
 * @param {*} length fn函数形参的个数
 * @returns 返回一个新的函数或者执行结果
 */

 function currying(fn, length) {
  length = length || fn.length; 	// 注释 1
  return function (...args) {			// 注释 2
    return args.length >= length	// 注释 3
    	? fn.apply(this, args)			// 注释 4
      : currying(fn.bind(this, ...args), length - args.length) // 注释 5
  }
}

// Test
const fn = currying(function(a, b, c) {
    console.log([a, b, c]);
});

fn("a", "b", "c") // ["a", "b", "c"]
fn("a", "b")("c") // ["a", "b", "c"]
fn("a")("b")("c") // ["a", "b", "c"]
fn("a")("b", "c") // ["a", "b", "c"]


/*
  注释 1:第一次调用获取函数 fn 参数的长度,后续调用获取 fn 剩余参数的长度

  注释 2:currying 包裹之后返回一个新函数,接收参数为 ...args

  注释 3:新函数接收的参数长度是否大于等于 fn 剩余参数需要接收的长度

  注释 4:满足要求,执行 fn 函数,传入新函数的参数

  注释 5:不满足要求,递归 currying 函数,新的 fn 为 bind 返回的新函数(bind 绑定了 ...args 参数,未执行),新的 length 为 fn 剩余参数的长度
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值