一个前端,爱跑步、爱吉他、爱做饭、爱生活、爱编程、爱南芳姑娘,爱我所爱。世间最温暖又无价的是阳光、空气与爱,愿它们能带你去更远的地方。

  • 文章
  • 心情
  • 照片墙
  • 留言板
  • 工具
  • 友链
  • biaoblog

    专注web开发技术分享

    JS内存泄露/垃圾回收/闭包

    技术 2 2025-05-21 10:21

    一.垃圾回收&&内存泄露

    前端垃圾回收(Garbage Collection, GC)主要由 JavaScript 引擎自动完成,用于释放不再被引用的内存。虽然前端开发者通常不需要手动释放内存,但了解一些常见导致内存泄漏和垃圾回收场景,对性能优化和避免 Bug 很有帮助。


    需要手动取消引用,辅助GC自动回收的场景(内存泄露了)

    1.如果引用类型的变量 - 数据作用域一直存在(全局)

    let obj = { name: 'Alice' };
    obj = null; // 原来的对象没有被引用,可以被回收
    

    拓展在js中“引用”的概念

    引用”不是字面上的“引用”这个词,而是编程里一个具体的概念:


    引用 = 变量里存的是某个内存地址,指向某个对象的真实位置。

    换句话说:


    • 当变量是引用类型(对象、数组、函数)时,变量里面存的是对象所在的内存地址(指针)。
    • 当变量是基本类型(数字、字符串、布尔等)时,变量里存的是值本身。

    举例说:

    let obj = { name: 'Alice' }; // obj 里面存的,是对象的地址(引用)
    
    let a = obj["name"];     // a 里面存的,是字符串 'Alice' 本身(值),不是引用
    

    2.事件监听器 window.addEventListener

    3.定时器setTimeout、setInterval

    4.DOM 元素被移除,引用也被清除


    二.闭包导致的内存泄露

    简单理解 闭包就是 函数A套函数B,函数A的变量,函数B也可以访问

    内存泄露导致的原因就是 正常执行完函数A,函数A中的变量会被自动回收,但是由于函数B还持续的对函数A的变量持续引用 而导致函数A中的变量无法被自动回收


    举例说明:

    function A() {
      let a = [1, 2, 3];
    
      return () => {
        return a[0];
      };
    }
    
    let value = A();
    


    调用 A(),函数内部创建了数组 a


    A() 返回了一个箭头函数,这个箭头函数形成了闭包,能访问 a


    你把这个闭包函数赋给了外部变量 value


    value 现在是一个函数,它闭包着 A 作用域里的变量 a


    只要 value 存在,闭包中的 a 就不会被垃圾回收。


    当你不再需要这个闭包,可以手动断开引用:

    value = null;  // 这样闭包里的 a 可以被回收
    


    总结

    • 闭包函数被返回并赋值给变量,形成闭包,引用了外部变量。
    • 变量存在时,闭包变量不被回收。变量置空后,闭包变量可被回收。



    上一篇:没有了

    下一篇:深入js的sort稳定排序

    文章评论

    评论列表(0