内存泄漏/js闭包/垃圾回收机制

js垃圾回收机制/内存泄漏

  • 闭包本身不会造成内存泄漏,过多的引用会造成内存泄漏
  • 个人理解,闭包是能能够通过该函数去访问函数内部变量,形式上是一个函数内部返回一个函数。
    匿名函数执行的时候会自动释放
function a(){
  var b= 10;
  return function(){
                return ++b;
  }
}
a()(); //11
// 匿名执行的内存释放掉 ,赋值执行的作用域[[scope]][0]闭包中保留f变量
console.dir(a)
let f = a()(); //11
console.dir(a)
  • 多个变量的相互引用会造成变量内存无法被回收
var a = {};
var b = {};
a.b =  b;
b.a = a;
  • 全局未申明的变量,会一致挂载在window下
function fn() {
  a = 1;
}
function fnc() { console.log(this.a) }
  • 定时器里面的回调函数,未清除时回调函数占用的内存不会被回收
setInterval(function() { console.log(1) })
  • DOM中的addEventLisner 函数及派生的事件监听, 比如Jquery 中的on 函数, vue 组件实例的 $on 函数,处理方式onload()/第三方库中的初始化函数,remove监听事件
  • Dom创建的顺序
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
document.body.appendChild(parentDiv);  // 先挂载父元素,再append子元素
parentDiv.appendChild(childDiv); 
// removeChild父元素时,子元素无法被释放

需要将子元素装载好,再挂载父元素才能保证后续元素内存释放

js回收机制

  • 计数清除
    这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。
  • 引用
    另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。

你可能感兴趣的:(内存泄漏/js闭包/垃圾回收机制)