javascript内存泄漏

来源:互联网 发布:淘宝化妆品哪家是正品 编辑:程序博客网 时间:2024/05/16 15:38

网搜结果:

1、循环引用(Circular References) — IE浏览器的COM组件产生的对象实例和网页脚本引擎产生的对象实例相互引用,就会造成内存泄漏。 
这也是Web页面中我们遇到的最常见和主要的泄漏方式; 

举例:

DOM对象与JS对象相互引用。范例: 
function Encapsulator(element) { 
this.elementReference = element; 
element.myProp = this; 

new Encapsulator(document.getElementById('myDiv')); 
解决方法: 
在onunload事件中写上: document.getElementById('myDiv').myProp = null; 



2、内部函数引用(Closures) — Closures可以看成是目前引起大量问题的循环应用的一种特殊形式。由于依赖指定的关键字和语法结构, 
Closures调用是比较容易被我们发现的; 

 举例:

a、给DOM对象添加的属性是一个对象的引用。范例: 
var MyObject = {}; 
document.getElementById('myDiv').myProp = MyObject; 
解决方法: 
在window.onunload事件中写上: document.getElementById('myDiv').myProp = null; 

b、给DOM对象用attachEvent绑定事件。范例: 
function doClick() {} 
element.attachEvent("onclick", doClick); 
解决方法: 
在onunload事件中写上: element.detachEvent('onclick', doClick); 



3、页面交叉泄漏(Cross-Page Leaks) — 页面交叉泄漏其实是一种较小的泄漏,它通常在你浏览过程中,由于DOM插入顺序引起。下面我们 
会讨论DOM插入顺序的问题,在那个示例中你会发现只需要改动少量的代码,我们就可以避免对象薄计对对象构建带来的影响; 

举例:

从外到内执行appendChild。这时即使调用removeChild也无法释放。范例: 
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
document.body.appendChild(parentDiv); 
parentDiv.appendChild(childDiv); 
解决方法: 
从内到外执行appendChild: 
var parentDiv = document.createElement("div"); 
var childDiv = document.createElement("div"); 
parentDiv.appendChild(childDiv); 
document.body.appendChild(parentDiv); 



4、貌似泄漏(Pseudo-Leaks) — 这个不是真正的意义上的泄漏,不过如果你不了解它,你可能会在你的可用内存资源变得越来越少的时候很郁闷

举例:

反复重写同一个属性会造成内存大量占用(但关闭IE后内存会被释放)。范例: 
for(i = 0; i < 5000; i++) { 
hostElement.text = "asdfasdfasdf"; 

这种方式相当于定义了5000个属性! 
解决方法: 
其实没什么解决方法:P~~~就是编程的时候尽量避免出现这种情况咯~~ 

参考文章:http://www.cnblogs.com/carekee/articles/1733847.html