码迷,mamicode.com
首页 > Web开发 > 详细

js内存回收

时间:2017-09-09 18:58:13      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:img   局部变量   相互   清理   move   回调函数   eve   var   blog   

1、标记清除

function test(){
  var a = 10;//被标记进入环境  
}
test();//执行结束后被标记离开环境 被回收

 

2、引用计数

function test(){
  var a = {}; //a的引用次数为0
  var b = a; //a的引用次数为1
  var c = a;//a的引用次数为2
  var b = {};  //a的引用次数减1 为 1 
}

当a 为零的时候,gc会将其回收销毁。

注意:循环引用计数,相互引用将无法使用引用计数回收。

function fn(){
  var a = {};
  var b ={};
  a.obj = b;
  b.obj = a;
}
fn();

技术分享

技术分享

 

3、内存泄漏常见的情况

一、意外的全局变量

function leaks(){
   leak ="xxx"; leak成为全局变量不会被回收  
}

方案:添加"use strict" 可避免。

二、闭包引起的内存泄漏

function bindEvent(){
  var  obj =document.createElement("xx");
  obj.click = function(){
   //....
  }
}

闭包可以维持函数内的局部变量,使其得不到释放。

方案:将事件定义在外部, obj.click = this.clickFunction;  function clickFunction(){...}或者将其对象的引用删除 obj = null;

三、没有清理dom元素引用

var element = {
  button: document.getElementById("button");
}
function shuff(){
  button.click();RemoveButton()
}
function RemoveButton(){ document.body.removeChild(document.getElementById("button")); }

虽然 removeChild 移除了button,但element里还保留着对button的引用,则button还保留在内存里面。

四、被遗忘的定时器或者回调

var data = {};
setInterval(function(){
   var node = document.getElementById("Node");
if(node){
node.innerHtml = JSON.stringify(data);
}
...},
1000)

如果id为Node的元素从Dom中移除,该定时器仍会存在,同时回调函数对data的引用,定时器外的data也无法释放。

五、子元素存在引用引起的内存泄漏

技术分享

方案:单refA = null 无效,需要refA = null ; refB =null;

 

js内存回收

标签:img   局部变量   相互   清理   move   回调函数   eve   var   blog   

原文地址:http://www.cnblogs.com/darrenhwang/p/7498603.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!