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的值所占的内存。