JS函数柯里化

什么是柯里化?

柯里化,即Curring。
是指将一个接收多个参数的函数改造成接收单个参数的函数。这个函数每次返回一个新的函数来处理下个参数,类似fn(param1)(param2)(param3)的形式,直到最后一次执行时输出希望的结果。

举个具体点的例子。两个变量相加改造成柯里化函数,当然这种写法不具有通用性,后面改造。

 	function add(x,y) {
      return x + y;
    }

    function curringAdd(x) {
      return (y)=>{
        return x + y;
      }
    }

    console.log(add(2,3));         // 5
    console.log(curringAdd(2)(3)); // 5

柯里化的优点

可以参数复用或减少判断次数
	function check(reg, target) {
      return reg.test(target);
    }

    console.log(check(/(\d)/g, "0123456")); //true
    console.log(check(/([a-z,A-Z])/g, "AaBb")); //true

    function curringCheck(reg) {
      return (target)=>{
        return reg.test(target);
      }
    }

    let hasNum = curringCheck(/(\d)/g);
    let hasLetter = curringCheck(/([a-z,A-Z])/g);

    console.log(hasNum("0123456")); //true
    console.log(hasNum("999")); //true
    console.log(hasLetter("AaBb")); //true
    console.log(hasLetter("cdEF")); //true
延迟执行

来改造下刚看到的add函数,这个函数不会每次收到参数都进行求和,而是在最后一次执行的时候统一进行操作。

    function add() {
      let params = [...arguments];

      let fun = (...val)=>{
        params.push(...val);
        return fun;
      };

      fun.toString = function (){
        return params.reduce(function (a, b) {
          return a + b;
        });
      };

      return fun
    }

    console.log(add(1)(2)(3)) //6

公共方法生成柯里化函数

封装了个方法把普通函数变成柯里化函数

  function createCurringFun(fun, args) {
    let _len = fun.length;
    let _args = args || [];
    return function () {
      _args = Array.prototype.concat(_args,...arguments);
      if(_args.length < _len){
        return createCurringFun(fun, _args)
      }
      return fun(..._args);
    }
  }

  function sum(x,y,z) {
    return x+y+z;
  }

  let test = createCurringFun(sum);
  console.log(test(1)(2)(3)) //6

总结

Curring主要还是为了多参数复用和函数式编程。它对性能有略微影响,但大多数的业务场景下,这细微的影响可以忽略不计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值