你知道JavaScript内存泄漏的原因吗?

你知道JavaScript内存泄漏的原因吗?,javascript,memory-leaks,Javascript,Memory Leaks,你知道JavaScript内存泄漏的原因吗? 我对浏览器很感兴趣:IE 7、FireFox 3、Safari 3;循环引用是导致许多问题的原因。 我记得IE6(不确定它是否适用于7)在XMLHTTP中严重泄漏。。。一旦完成设置onreadystatechange=null并修复它。有一篇关于它的好文章。它并没有具体介绍浏览器,而是描述了内存泄漏和JavaScript的整个问题 我认为,在为公众开发网站时,最好是尽可能让浏览器不特定,而不是针对少数浏览器进行优化。IE中有一个典型的内存

你知道JavaScript内存泄漏的原因吗?
我对浏览器很感兴趣:IE 7、FireFox 3、Safari 3;循环引用是导致许多问题的原因。
我记得IE6(不确定它是否适用于7)在XMLHTTP中严重泄漏。。。一旦完成设置onreadystatechange=null并修复它。

有一篇关于它的好文章。它并没有具体介绍浏览器,而是描述了内存泄漏和JavaScript的整个问题


我认为,在为公众开发网站时,最好是尽可能让浏览器不特定,而不是针对少数浏览器进行优化。

IE中有一个典型的内存泄漏:-

function body_onload()
{
    var elem = document.getElementById('someElementId');
    // do stuff with elem
    elem.onclick = function() {
        //Some code that doesn't need the elem variable
    }
 }
此代码运行后,会出现循环引用,因为元素有一个函数分配给它的onclick事件,该事件引用一个范围对象,而该范围对象又持有对元素的引用

someElement->onclick->function scope->elem->someElement

在IE中,DOM元素是Javascript GC无法清理的基于COM的引用计数对象

在上述代码中添加最后一行将使其更干净:-

var elem = null;
您可以查看MSDN文章中的Internet Explorer内存泄漏模式。还有一些用于检测内存泄漏的工具:


您正在处理两种对象(和两个垃圾收集器),javascript和DOM对象,它们可以相互引用(循环引用),然后即使在页面卸载时,GC也不能处理其所有对象。这里有一个很好的描述:


关于这个主题的优秀文章+1对于可能对IE8感兴趣的人来说,值得一提的是,本文中介绍的大多数示例不再泄漏IE8中的内存。应该这样读:是的,问题适用于7。您不能分配null,因为它不是一个函数,您需要一个在全局范围内创建的void function(){},和/或将null分配给包含对xmlhttp对象引用的变量。