• JavaScript进阶——闭包、高阶函数与柯里化


    一、闭包

    闭包(closure)是指在函数内部创建一个新的作用域,使得函数内部的变量和函数可以被保留或者延长它们的生命周期而不被释放。

    具体来说,当一个函数返回另一个函数时,内部函数可以访问外部函数的变量、参数以及其他内部函数,因为它们存储在该函数的闭包环境中。这样,即使外部函数已经执行完毕,闭包仍然保留了对其所需变量的引用,而这些变量和函数并没有被垃圾回收机制清除。

    闭包在 JavaScript 中有着广泛的应用,比如封装变量、实现数据私有化、缓存结果等。

    下面是一个使用闭包来实现缓存结果的示例:

    function cache(func) {
      // 存储结果
      const results = {};
    
      return function (arg) {
        if (results[arg]) {
          console.log("缓存中找到结果,返回缓存中的此结果");
          return results[arg];
        } else {
          console.log("缓存中找不到结果,准备存入并返回此结果");
          const result = func(arg);
          results[arg] = result;
          return result;
        }
      };
    }
    
    const add = cache(function (x) {
      return x + 10;
    });
    
    console.log(add(5)); // 缓存中找不到结果,准备存入并返回此结果 15
    console.log(add(5)); // 缓存中找到结果,返回缓存中的此结果 15
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在上述示例中,cache 函数接收一个需要缓存结果的函数 func 作为参数,并且返回一个新的函数。这个新函数会在内部记录一个结果缓存的对象 results,并且检查给定的参数 arg 是否已经在缓存中存在,如果存在,则直接从缓存中返回对应的结果;否则执行原函数并把计算结果存入缓存中。

    通过这种方式,我们可以减少重复计算的开销,提高程序的性能,同时也保留了该函数之前的计算结果。这个过程就是通过闭包来实现的。

    二、高阶函数

    高阶函数(Higher-order function)是指能够接收其他函数作为参数或者返回一个函数作为结果的函数。在 JavaScript 中,函数可以作为一等公民,具有和其他类型一样的权利和特殊的地位,因此高阶函数也得以广泛应用。

    例如,Array 的原型对象中的 mapfilter 方法就是高阶函数的典型例子。它们都接受一个函数作为参数,并将这个函数应用于数组元素上,最终返回一个新的经过处理的数组。这些方法可以用来过滤、映射、排序或者转换数组中的数据格式等。

    高阶函数可以帮助我们把代码进行模块化、提高代码的复用性和可读性,并且使得程序更加灵活、易于扩展

    三、柯里化

    柯里化(Currying)是一种函数式编程的技术,它可以将接受多个参数的函数转化为一系列嵌套的单一参数函数

    具体来说,柯里化就是把一个多参数函数转化为多个单参数函数的过程。在 JavaScript 中实现柯里化通常使用闭包高阶函数。例如,一个接受两个参数的普通函数 add(a, b) 可以转化为柯里化函数 curriedAdd(a)(b),这样我们可以分别传入不同的参数来调用这个函数,实现更加灵活的使用。

    下面是一个 JavaScript 中实现柯里化的示例:

    function add(x) {
      return function(y) {
        return x + y;
      };
    }
    
    const curriedAdd = add(2);
    console.log(curriedAdd(3)); // 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    【L2GD】: 无环局部梯度下降
    方舟:生存进化开服务器端口映射教程
    索尼 toio™ 应用创意开发征文|探索创新的玩乐世界——索尼 toio™
    dubbo参数调优说明
    植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法技术应用
    vue 3.0 常用API 的介绍
    Android 12系统源码_窗口管理(三)WindowManagerService对窗口的管理过程
    windows消息机制
    专利申请预审需要满足什么条件?
    关于环保电缆,你了解多少
  • 原文地址:https://blog.csdn.net/weixin_43599321/article/details/130856060