当前位置: 首页 > article >正文

js-闭包(封装私有变量,创建模块,函数柯里化接收多个参数转换为接收单一参数,实现迭代器-遍历数组与对象)

1.前言

        闭包(Closure)是JavaScript中的一个重要概念,它是指有权访问另一个函数作用域中的变量的函数。简单来说,闭包就是一个函数,这个函数能够记住并访问其词法作用域,即使这个函数在其词法作用域之外执行。 

2.使用场景

 2.1工厂函数

 闭包可以用来创建工厂函数,工厂函数是一种返回函数的函数。

  • 是一个函数。

  • 用来创建对象。

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
console.log(add5(10)); // 15
2.2 模块模式

 闭包可以用来实现模块模式,模块模式是一种将相关函数和变量封装在一起的机制,可以用来组织代码,防止全局命名空间的污染。

const myModule = (function() {
  let privateVariable = 'I am private';

  function privateFunction() {
    console.log('I am private');
  }

  return {
    publicMethod: function() {
      console.log('I am public');
    }
  };
})();

myModule.publicMethod(); // I am public
// myModule.privateVariable; // ReferenceError: privateVariable is not defined
// myModule.privateFunction(); // ReferenceError: privateFunction is not defined
2.3 迭代器

闭包可以用来实现迭代器,迭代器是一种可以遍历集合(如数组或对象)的机制。 

function createIterator(arr) {
  let index = 0;

  return {
    next: function() {
      if (index < arr.length) {
        return { value: arr[index++], done: false };
      } else {
        return { done: true };
      }
    }
  };
}

const iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { done: true }
2.4.实现函数柯里化 

闭包可以用来实现函数柯里化,函数柯里化是一种将接受多个参数的函数转换成接受一个单一参数(最初函数的第一个参数)的函数,并返回接受余下的参数且返回结果的新函数的技术。 

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      };
    }
  };
}

function sum(a, b, c) {
  return a + b + c;
}

const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 6

3.作用于注意

 闭包可以保留被定义时的作用域,闭包内部可以访问外部函数的局部变量 ,即使外部函数已经执行完毕。

闭包会让函数内部的变量在后续函数执行后继续存于内存中,直到没有任何的引用指向闭包,不注意管理闭包可能会造成内存泄漏。

闭包可能会导致内存泄漏(注意是可能)      


http://www.kler.cn/a/507712.html

相关文章:

  • 在Mac mini上实现本地话部署AI和知识库
  • leetcode 面试经典 150 题:汇总区间
  • FFmpeg硬件解码
  • 计算机组成原理(计算机系统3)--实验二:MIPS64乘法实现实验
  • 硬件知识:显示器发展历程介绍
  • IP层之分片包的整合处理
  • 御载 MATLAB
  • RHCE是什么级别
  • 鸿蒙Flutter实战:16-无痛开发指南(适合新手)
  • ios文件管理,沙盒机制以及如何操作“文件”APP,把文件共享到文件app
  • Golang Gin系列-2:搭建Gin 框架环境
  • Word2Vec中的CBOW模型训练原理详细解析
  • (2)Elasticsearch8.17的web管理工具:kibana
  • Vue3 Element-Plus el-tree 右键菜单组件
  • 案例 —— 怪物出水
  • 【绝对无坑】Mongodb获取集合的字段以及数据类型信息
  • 没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
  • AI生成文档——Uni-App CSS 样式开发指南
  • JS宏实例:自创FS对象读取文本文件或CSV文件数据
  • 一、1-2 5G-A通感融合基站产品及开通
  • HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (五、电影详情页的设计实现)
  • CTE与临时表:优劣势对比及使用场景分析
  • 简明docker快速入门并实践方法
  • 代码随想录算法训练营day23(0116)
  • 纯代码实现给WordPress添加文章复制功能
  • C#实现字符串反转的4种方法