Js闭包Closure 及 其可能产生的内存泄漏问题

server/2025/3/31 5:35:38/

闭包的主要作用:实现数据私有,函数内定义的私有变量,外面可以使用访问,但不可以修改。

以统计调用次数的函数为例:

普通形式:
javascript">let a = 0;function fn() {a++;console.log(`a: ${a}`);}

闭包形式:
javascript">    function count() {let a = 0;function fn() {a++;console.log(`a: ${a}`);}return fn;}const fun = count();

    一,为什么调用时要使用fun() 而不是直接count():

    • count() 只是返回了 fn 函数的引用,而没有执行 fn 函数。
    • fun() 是对 fn 函数的调用,它会执行 fn 函数的逻辑,即对局部变量 a 进行递增操作并打印其值。

    因此,为了执行 fn 函数的逻辑,你需要将 count() 的返回值赋值给一个变量,然后调用这个变量来执行 fn 函数。

    二,原理:

    闭包 fn 保留了对 count 函数内部局部变量 a 的引用,即使 count 函数执行完毕,a 的值仍然被保留。而在全局作用域中定义的 a 是一个新的变量,与闭包内部的 a 没有关联。因此,每次调用 fun() 都会操作闭包内部的 a,而不会受到全局变量 a 的影响。

    闭包产生的内存泄漏:

    示例代码:

    javascript">    function fn() {let count = 1function fun() {count++console.log(`函数第${count}次执行`)}return fun}const res = fn()res() // 2res() // 3

    谁会产生内存泄漏:count变量

    借助于垃圾回收机制的 标记清除法 可以看出:

    ① result 是一个全局变量,代码执行完毕不会立即销毁

    ② result 使用 fn 函数

    ③ fn 用到 fun 函数

    ④ fun 函数里面用到 count

    ⑤ count 被引用就不会被回收,所以一直存在

    注意:不是所有内存泄漏都要手动回收,比如react里面很多闭包不能回收


    http://www.ppmy.cn/server/178658.html

    相关文章

    批量给 PPT 幻灯片页面添加文字和图片水印

    给 PPT 文档添加水印是非常常见的一个操作,不仅可以保护我们的版权,也可以起到很好的宣传作用。那如何给 PPT 文档地幻灯片页面添加水印呢?如何添加文字水印或者图片水印呢?今天就给大家介绍一种批量给 PPT 添加水印的方法。 在网…

    【C++初阶】从零开始模拟实现vector(含迭代器失效详细讲解)

    目录 1、基本结构 1.1成员变量 1.2无参构造函数 1.3有参构造函数 preserve()的实现 代码部分: push_back()的实现 代码部分: 代码部分: 1.4拷贝构造函数 代码部分: 1.5支持{}初始化的构造函数 代码部分: …

    在ASP.NET Core中使用NLog:配置与性能优化指南

    在ASP.NET Core中使用NLog:配置与性能优化指南 在ASP.NET Core中使用NLog:配置与性能优化指南1. 安装NLog包2. 基础配置2.1 创建nlog.config文件2.2 程序启动配置 3. 在代码中使用日志4. 性能优化配置4.1 异步日志处理4.2 自动清理旧日志4.3 缓冲写入优化…

    探秘 C++ 双星系统模型:实现快速值切换

    在软件开发的世界里,有时我们会遇到需要频繁在两个值之间进行切换的场景。为了高效地处理这类情况,我们可以设计一个专门的类来实现这个功能。今天,我们就来详细介绍一个用 C 实现的双星系统模型类 Turner,它能够帮助我们轻松地在…

    蓝桥备赛(25)算法篇【差分】

    一、差分 前缀和和差分的核心思想是预处理 , 可以在暴力枚举的过程中 , 快速给出查询结果 , 从而优化时间复杂度 。 最经典的用空间替换时间的做法。 学完差分之后 , 大家会发现 , 前缀和与差分是一对互逆的运算 二、一…

    【QA】外观模式在Qt中有哪些应用?

    1. QWidget及其布局管理系统 外观模式体现 QWidget 是Qt中所有用户界面对象的基类,而布局管理系统(如 QVBoxLayout、QHBoxLayout、QGridLayout 等)就像是一个外观类。客户端代码(开发者编写的界面代码)通常不需要直接…

    12、Python 异常处理与调试技巧

    Python 异常处理与调试技巧:从防御性编程到生产级排错 本文将系统讲解Python异常处理与调试的核心技术,涵盖从基础语法到生产级调试的完整知识体系,通过20个代码示例揭示异常处理的深层逻辑,并提供可运行于PyCharm/VSCode的完整代…

    HarmonyOS Next~鸿蒙媒体开发技术解析:Audio Kit与AVCodec Kit的深度应用

    HarmonyOS Next~鸿蒙媒体开发技术解析:Audio Kit与AVCodec Kit的深度应用 鸿蒙操作系统(HarmonyOS)在媒体开发领域展现了强大的技术实力,其核心的媒体类Kit——Audio Kit(音频服务)与AVCodec K…