造成内存泄漏的四种情况

57 阅读1分钟

意外的全局变量

  • 由于使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收

被遗忘的计时器或回调函数

  • 设置了 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每日一题