柯里化

本文介绍了JavaScript中柯里化(Currying)的概念,即如何将一个多参数的函数转换为一系列单参数函数的过程。通过示例展示了柯里化的简单实现以及优化版本,解释了柯里化可以用于提前绑定部分参数,简化函数调用和提高代码复用性。同时,讨论了柯里化在函数式编程中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 实现柯里化
    柯里化是什么?是指一个函数,它接收函数A,能返回一个新的函数,新函数能够处理函数A的剩余参数
    为什么要有柯里化?什么场景需要?
    https://github.com/mqyqingfeng/Blog/issues/42
  1. 先看一个简单版本,这个版本仅return一次函数,所以他的参数传递最多两次必须要传完,想要使用 curry(add)(1)(2)会报错。
      var curry = function (fn) {
        var args = [].slice.call(arguments, 1); // curry调用时的参数
        return function () {
          var newArgs = args.concat([].slice.call(arguments)); // addCurry调用时的参数
          console.log(newArgs)
          return fn.apply(this, newArgs);
        };
      };
      function add(a, b) {
          return a + b;
        }
    
        var addCurry = curry(add, 1, 2);
        // addCurry() // 3
        console.log(addCurry())
        //或者
        var addCurry1 = curry(add, 1);
        console.log(addCurry1(2))
        //或者
        var addCurry2 = curry(add);
        console.log(addCurry2(1, 2)) // 3
    
  2. 优化
  // 第二版
function sub_curry(fn) {
  var args = [].slice.call(arguments, 1);
  return function () {
    return fn.apply(this, args.concat([].slice.call(arguments)));
  };
}

function curry(fn, length) {

  length = length || fn.length;

  var slice = Array.prototype.slice;

  return function () {
    if (arguments.length < length) { // 确保剩下最后一个参数的话 可以直接走sub_curry的拼接
      var combined = [fn].concat(slice.call(arguments));
      return curry(sub_curry.apply(this, combined), length - arguments.length);
    } else {
      console.log(fn) //输出 fn.apply(this, args.concat([].slice.call(arguments))); 根据执行函数fn 运算拼接参数的逻辑
      return fn.apply(this, arguments);
    }
  };
}
var fn = curry(function add(a, b) {
    return a + b;
  }) 
const one = fn(1)(2)
console.log(one) // 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值