ES5 ES6分别实现函数柯里化及应用

函数柯里化指的是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术

ES5

//不确定参数
function curry(fn, args) {
  // 获取函数需要的参数长度
  let length = fn.length;

  args = args || [];

  return function() {
    let subArgs = args.slice(0);

    // 拼接得到现有的所有参数
    for (let i = 0; i < arguments.length; i++) {
      subArgs.push(arguments[i]);
    }

    // 判断参数的长度是否已经满足函数所需参数的长度
    if (subArgs.length >= length) {
      // 如果满足,执行函数
      return fn.apply(this, subArgs);
    } else {
      // 如果不满足,递归返回科里化的函数,等待参数的传入
      return curry.call(this, fn, subArgs);
    }
  };
}

//确定参数
function add(a, b, c) {
  return a + b + c;
}

// 使用函数柯里化转换add函数
function curriedAdd(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    }
  }
}

// 使用柯里化后的函数进行调用
curriedAdd(1)(2)(3); // 输出:6

ES6

//不确定参数
function curry(fn, ...args) {
  return args.length >= fn.length ? fn(...args) : curry.bind(null, fn, ...args);
  //如果存起来的实参数量 比 fn的形参 多,则直接调用fn
  //如果还存不够,则继续存
}
//确定参数
function add(a, b, c) {
  return a + b + c;
}

const curriedAdd = add.bind(null, 1);
const result = curriedAdd(2, 3); // 输出:6

应用

1.参数确定(累加参数确定)

function sum(a,b,c,d){
    return a+b+c+d
}

let curried = curry(sum)
console.log(curried(1)(2)(3)(4))//10
console.log(curried(1,2)(2,4))//9

2.不确定参数实现sum([1,2,3…])无限累加

function add(arr){
   return arr.reduce((acc,item)=>{
        return acc+item
    },0)
}
 
let curried = curry(add)
console.log(curried([1,2,3,4,5])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值