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