# V8 垃圾回收
标记清除 和 引用计数
# 标记清除
function test(){
var a=10;//被标记,进入环境
var b=20;//被标记,进入环境
}
test();//执行完毕之后a、b又被标记离开环境,被回收
1
2
3
4
5
2
3
4
5
# 引用计数
function test(){
var a={};//a的引用次数为0
var b=a;//a的引用次数加1,为1
var c=a;//a的引用次数加1,为2
var b={};//a的引用次数减1,为1
}
1
2
3
4
5
6
2
3
4
5
6
# 会引发内存泄漏的情况
# 使用全局变量
# 闭包引起的内存泄露
# 没有清除的DOM引用
# 被遗忘的定时器或者回调
var someResouce=getData();
setInterval(function(){
var node=document.getElementById('Node');
if(node){
node.innerHTML=JSON.stringify(someResouce)
}
},1000)
1
2
3
4
5
6
7
2
3
4
5
6
7
这样的代码很常见, 如果 id 为 Node 的元素从 DOM 中移除, 该定时器仍会存在, 同时, 因为回调函数中包含对 someResource 的引用, 定时器外面的 someResource 也不会被释放
# 循环引用
// 造成循环引用
window.onload=function outerFunction(){
var obj=document.getElementById("element"):
obj.onclick=function innerFunction(){};
};
// 手动解除引用
myObject.element=null;
element.o=null;
window.onload=function outerFunction(){
var obj=document.getElementById("element"):
obj.onclick=function innerFunction(){};
obj=null;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
← 变量提升 - hoisting 执行上下文 →