【javaScript基础】Js柯里化 fn(1)(2)(3).val

Currying 为实现多参函数提供了一个递归降解的实现思路——把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数,在某些编程语言中(如 Haskell),是通过 Currying 技术支持多参函数这一语言特性的。

接下来用一个题目来解释:

  • 题目:实现fn(1)(2)(3).val // 6

简单实现方式:
js中,一切皆为对象,可以给fn函数,添加变量val,再来控制其变化;

var fn = (val) => {
  fn.val += val;
  return fn;
};

fn.val = 0;
console.log(fn(1)(2)(3).val); //6
console.log(fn(1).val); //7 --> 存在问题

存在问题:
因为fn.val是全局变量,所以fn每一次调用,都会进行累加;
解决方案:
在fn()方法中包含一个方法f,试每一个fn都存在自己的一个独立变量

var fn = (val) => {
  let f = (x) => {
    f.val += x;
    return f
  };
  f.val = val;
  return f;
};

console.log(fn(1)(2)(3).val); //6
console.log(fn(1).val); //1

至此,就可以实现fn(1)(2)(3).val的方法了,但如果我们进阶一步怎么办嘞?

进阶实现:
fn(1,2)(3).val = 6
实现方案:
利用es6的解构函数,argument

function fn() {
  let arr = [...arguments];
  let sum = (array) => {
    return array.reduce((pre, cur) => pre + cur, 0);
  };

  // 因为fn使用了默认arguments
  // 所以此处要使用...args传入参数
  function f(...args) {
    f.val += sum([...args]);
    return f;
  }
  // 因为要先初始化function f,再使用f
  // 所以放在function f()后面
  f.val = sum(arr);
  return f;
}

console.log(fn(1)(2)(3).val);
console.log(fn(1).val);

Tips:箭头函数不存在this,没有…arguments

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值