函数柯里化实现add(1)(2)(3)

函数柯里化实现add(1)(2)(3)

1.初步实现

在JavaScript中,你可以通过创建一个返回函数的函数来实现这种链式调用的模式。这种模式通常被称为柯里化(Currying)的一种形式,尽管在这个例子中,我们并没有减少参数的数量,而是延迟了它们的处理。

以下是一个简单的实现方式:

function add() {
  let args = Array.prototype.slice.call(arguments);
  function inner() {
    args.push(...arguments);
    return inner;
  }
  inner.toString = function () {
    return args.reduce(function (pre, cur) {
      return pre + cur;
    });
  };
  return inner;
}
//必须要有一个加号
console.log(+add(1)); //1
console.log(+add(1, 2)); //3
console.log(+add(1, 2)(3)); //6
console.log(+add(1)(2)(3)(4)(5)); //15
console.log(add(1)(2)(3)(4)(5)); //返回一个函数

我们可以看打印结果:
在这里插入图片描述

在这个例子中,add 函数返回了一个名为inner的内部函数。inner函数接受一些数字参数,将其加到 args数组,然后返回自己。因此,你可以连续调用add(1)(2)(3),每次调用都会将新的数字添加到args数组中。

需要注意的是,由于inner是一个函数,如果你直接打印add(1)(2)(3),它将输出函数本身而不是结果。为了解决这个问题,我们覆盖了innertoString方法,使其返回数组中所有数字之和。这样,当你尝试打印add(1)(2)(3)时,实际上会调用 inner.toString(),从而得到结果。

2.完善代码

然而,上述这种覆盖 toString 的方法并不是最佳实践,因为它改变了 inner 函数的预期行为。一个更好的方法是提供一个方法来获取结果,例如:

function add() {
  let args = Array.prototype.slice.call(arguments);
  function inner() {
    args.push(...arguments);
    return inner;
  }
  inner.getResult = function () {
    return args.reduce(function (pre, cur) {
      return pre + cur;
    });
  };
  return inner;
}
let result = add(1, 2, 3, 4, 5);
console.log(result.getResult()); // 输出 15

在这个版本中,我们添加了一个 getResult 方法来获取结果,而不是覆盖 toString。这样,inner函数的行为就更加清晰和可预测了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳与星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值