意外的全局变量
- 由于使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收
被遗忘的计时器或回调函数
- 设置了 setInterval 定时器,而忘记取消它,如果循环函数有对外部变量的引用的话,那么这个变量会被 一直留在内存中,而无法被回收
脱离 DOM 的引用
- 获取一个 DOM 元素的引用,而后面这个元素被删除,由于一直保留了对这个元素的引用,所以它也无法被回收
闭包
- 不合理的使用闭包,从而导致某些变量一直被留在内存当中
- 函数执行时,局部变量会进行压栈操作,函数执行完毕后,局部变量会进行出栈操作进行销毁
- 在函数执行的时候,如果局部变量不再被需要,当前栈中的变量才会被回收
- 如果对闭包进行了拷贝,那么GC对局部变量的监听就会结束
function fn() {
let w = 20;
return function fn2() {
w++;
console.log(w);
}
}
fn()()//21
fn()()//21
fn()()//21
var x = fn() //这里相当于把fn2赋值给了一个变量x,x相当于一个委托方
x()//21 委托方有fn2的拷贝,包括对变量w的地址拷贝
x()//22 不是直接执行的fn2,所以w会一直被需要,不会被回收
x()//23
-------------------------------------------------------------------------2024.5.19每日一题