如果避免内存泄漏

减少定义全局变量

var a = 1;//window.a = 1
function fn(){
  b = 1;//windown.b = 1
}
fn()

当我们使用var定义全局变量时,会将该变量值挂载到window上,在程序没有停止运行时,全局上的变量时不会清除的,所以就照成了内存泄漏,我们可以在变量使用过后将其设置为null,来触发垃圾回收机制。

使用未声明的变量时,也是挂载到window上的,也会导致内存泄漏。

定时器在不使用时清除

let arr = []
setInterval(()=>{
  arr.push(1);
},1000);

如果我们不清除上面的定时器,arr数组就会一直增大,会造成内存泄漏。

闭包

function a(){
  let b = 1;
  return function(){
    return b;
  }
}
let fn = a();
console.log(fn());

一般情况下,当a函数执行完后,其作用域就会被销毁,但是由于a函数中返回了一个匿名函数,该匿名函数使用了a函数中的b变量,所以产生了闭包,导致a函数无法被回收。导致了内存泄漏。只有当我们给fn设置成null的时候,也就是取消对匿名函数引用的时候才会销毁a函数的作用域。

清除DOM引用

弱引用

在ES6中增加了两个新的数据结构,WeakMap和WeakSet,这两个就是弱引用。

参考资料

[1]一文搞懂V8引擎的垃圾回收