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

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

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

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

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

闭包形式:
    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 的影响。

    闭包产生的内存泄漏:

    示例代码:

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

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

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

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

    ② result 使用 fn 函数

    ③ fn 用到 fun 函数

    ④ fun 函数里面用到 count

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

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

    相关文章:

  • 详解 printf 打印的所有内容
  • C之(15)cppcheck使用介绍
  • 【中文翻译】第12章-The Algorithmic Foundations of Differential Privacy
  • 分布式事务与Seata
  • 题型笔记 | Apriori算法
  • 影视后期工具学习之PR(中)
  • 十亿级流量削峰实战:LinkedBlockingQueue缓冲池的工程化实现
  • 2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序
  • 深入理解 C++11 智能指针:独占、共享与弱引用的完美管理
  • 19 数码管的动态显示
  • 第十二章 | Solidity 智能合约前后端集成实战
  • 深入理解倒排索引原理:从 BitSet 到实际应用
  • 蓝桥杯备赛(7):ST表
  • DeepSeek 指令符号及提示词示例
  • 【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解
  • 【C++教程】break语句
  • 认知篇#5:什么是激活函数?激活函数有什么用?几个简单激活函数的简介(1)
  • 连续型随机变量及其分布
  • AI Agent战国时代:Manus挑战者的破局之道与技术博弈
  • java江湖系列——集合世家争霸(下)
  • 移动互联网未成年人模式正式发布
  • 中青旅:第一季度营业收入约20.54亿元,乌镇景区接待游客数量同比减少6.7%
  • 腾讯重构混元大模型研发体系:成立大语言和多模态模型部,提升AI长期技术作战能力
  • 卡尼领导的加拿大自由党在联邦众议院选举中获胜
  • 伊朗内政部长:港口爆炸由于“疏忽”和未遵守安全规定造成
  • 日月谭天丨赖清德强推“脱中入北”是把台湾带向死路