7.柯里化函数

本文探讨了函数式编程中的柯里化技术,它将多参数函数转换为一系列单参数函数调用。通过柯里化,可以实现参数复用、正则校验和延迟执行等功能。例如,柯里化常用于简化Ajax请求,创建可复用的请求配置。然而,柯里化也存在性能问题,如访问arguments对象较慢和额外的内存与速度开销。此外,JavaScript中的bind机制实际上也利用了类似柯里化的概念。
摘要由CSDN通过智能技术生成

函数式编程之柯里化

b站视频

柯里化函数:部分求值。将多变量函数拆解为单变量的多个函数的依次调用。
  • 原理:利用闭包创建一个不销毁的私有域,将要保存的内容作为外部函数的变量,并且返回一个函数,然后执行这个函数。

例子:

        function add(x, y) {
            return x + y;
        }
        function curryAdd(x) {
            return function (y) {
                return x + y;
            }
        }
        console.log(add(1, 2)); //3
        console.log(curryAdd(1)(2)); //3

源码实现:

        function currying(fn, ...args) {
            // length: fn函数的参数个数 -- 如 add有三个参数
            let length = fn.length;
            let allArgs = [...args];
            const result = (...newArgs) => {
                // 合并参数 -- 合并后续传进来的参数 --如下面例子中的a(2)
                allArgs = [...allArgs, ...newArgs];
                // 判断参数是否达到三个,如果达到就调用fn函数
                if (allArgs.length === length) {
                    return fn(...allArgs);
                } else {
                    // 没达到则返回
                    return result;
                }
            }
            // 第一次执行的时候,对应下面currying(add,1) 
            return result;
        }
        // 测试
        const add = (a, b, c) => a + b + c;
        // const a = currying(add, 1)(2)(3);
        const a = currying(add, 1)(2)(3);
        console.log(a);

优点:

  • 参数复用

    • 正则校验

    • 发送请求

      function ajax(method, url, data) {
          console.log(method, url, data);
      }
      var ajaxCurry = Curry(ajax);
      var postAjax = ajaxCurry('POST');
      postAjax('www.test1.com', 'name=hehe&code=111');
      postAjax('www.test1.com', 'name=hehe&code=222');
      
      var postTest1Ajax = postAjax('www.test.com');
      postTest1Ajax('name=hehe&code=11');
      postTest1Ajax('key');
      
  • 延迟执行

    • 我们 JS 中经常使用的 bind,实现机制就是 Currying

缺点:

  • 存取arguments对象通常比存取命名参数要慢一些
  • 一些老版本的浏览器在arguments.length的实现上是相当慢的
  • 使用fn.apply(...)apply.call(...)通常比直接调用fn(...)稍微慢
  • 创建大量嵌套作用域和闭包函数会带来开销,无论是内存还是速度上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值