柯里化函数

185 阅读2分钟

作用

1.逐步接受参数,并缓存供后期使用

2.不立刻执行,延后执行

3.符合计算的条件,将缓存的函数,统一传递给执行方法

例子

对一段字符串进行正则验证

下面这种写法比较传统,但是如果出现对不同字符串进行同一种正则校验,就略显繁琐

      // 非柯里化
      let hasSpace = (reg, str) => {
        return reg.test(str);
      };

下面这一种则利用柯里化使得对不同字符串进行同一种正则校验简化了一些

      //curry
      function curryFn(reg) {
        return function (str) {
          return reg.test(str);
        };
      }
      let curryHasSpace = curryFn(/\s+/g); //匹配空白字符
      console.log(curryHasSpace('xxx xxx'))

接下来用柯里化实现实现 add(1)(2, 3)(4)() = 10

一眼看上去是对传入的参数进行累加,并且也符合柯里化函数的作用,如果一直传入参数就会对参数进行缓存,当不传入参数调用时,返回结果



首先先把累加的函数写出来

      function fn() {
        let arrs = [].slice.call(arguments);
        return arrs.reduce((a, b) => a + b);
      }

然后再写出柯里化处理的函数,这边我们对传入的参数进行缓存,如果调用函数时,传入了参数,则将参数保存在curryArr中,并且return 进行此操作的函数,反之,则调用累加函数

      function curry(fn) {
        let curryArr = [];
        return function next() {
          let arr = [].slice.call(arguments);
          if (arr.length > 0) {
            curryArr = curryArr.concat(arr);
            return next;
          } else {
            return fn.apply(this, curryArr);
          }
        };
      }

最后

      let add = curry(fn);
      console.log(add(1)(23)(4)());    //10