在运行例子时请看着你任务管理器中进程IE(我用的是IE8)的内存变化,(注:请注意例子中标黑部分)
例1:结论:IE内存基本不变
//---------------正常-----------------------
var a = new Array(1),i = 10000;
function loop(){
if(i--){
var el = document.createElement('div');
var nd = document.createTextNode(i);
el.appendChild(nd);
a.push(el);
document.body.appendChild(el);
var de = a.shift();
if(de){
de.parentNode.removeChild(de);
}
setTimeout(loop, 100);
}
};
loop();
例2:结论:IE内存基本不变
//---------------正常-----------------------
var a = new Array(1),i = 10000;
function clickFn(){
}
function loop(){
if(i--){
var el = document.createElement('div');
var nd = document.createTextNode(i);
el.appendChild(nd);
el.attachEvent('onclick', clickFn);
a.push(el);
document.body.appendChild(el);
var de = a.shift();
if(de){
de.parentNode.removeChild(de);
}
setTimeout(loop, 100);
}
};
loop();
例3:结论:IE内存平稳增加,速度大概1M/s
//---------------内存泄漏-----------------------
var a = new Array(1),i = 10000;
function loop(){
if(i--){
var el = document.createElement('div');
var nd = document.createTextNode(i);
el.appendChild(nd);
el.onclick = function(){}
a.push(el);
document.body.appendChild(el);
var de = a.shift();
if(de){
de.parentNode.removeChild(de);
}
setTimeout(loop, 100);
}
};
loop();
例4:结论:IE内存平稳增加,速度大概1M/s
//---------------内存泄漏-----------------------
var a = new Array(1),i = 10000;
function loop(){
if(i--){
var el = document.createElement('div');
var nd = document.createTextNode(i);
el.appendChild(nd);
el.attachEvent('onclick', function(){});
a.push(el);
document.body.appendChild(el);
var de = a.shift();
if(de){
de.parentNode.removeChild(de);
}
setTimeout(loop, 100);
}
};
loop();
总结:循环引用会产生内存泄漏问题,
例如:var el = document.createElement('div');// javascript对象引用DOM对象
el.refjsobj = el; //DOM对象又引用javascript对象
由以上例子可知,当el.refjsobj引用匿名函数时,也会造成内存泄漏。解决方法:就是在删除节点前,把元素引用javascript对象属性(如:refjsobj)设置为null.
以上总结如有不对之处,还快快指出,不要让兄弟误入歧途。3Q。