难以使用IE Javascript泄漏检测器

tho*_*ter 7 javascript memory-leaks internet-explorer-7 internet-explorer-6 memory-leak-detector

当使用某些Javascript代码模式时,Microsoft的IE6和IE7浏览器会遭受内存泄漏.在IE6早期,我已经找到了很多关于泄漏模式的信息.但是,我知道很多(但不是全部)这些都是在IE7和IE6的服务包中修复的.我无法找到关于IE6和IE7修补版本中仍然存在哪些泄漏的可靠信息来源.

有几种工具可以检测泄漏模式.但我似乎无法按照我想要的方式使用它们!

  • 微软的(V2)内存泄漏检测器在我的代码中找不到任何泄漏,即使我使用的模式应该泄漏.这可能是因为我正在运行IE8 - 是否有任何非头痛的方式让它假装是IE6或IE7?

  • Drip和sIEve似乎发现了"孤儿"品种的大量泄漏.当然这些必须是误报 - 实际上我添加到文档然后再删除的每个元素都列出了,我不相信我会继续引用它们.如果它们是真实的,我怎样才能找到我的代码中泄漏的位置?这些工具具有"属性"功能,不显示任何内容,使其看起来很破碎.同样,我不知道这些泄漏是否与IE6或IE7相关,或者只是IE8,这是我安装的IE的版本.

所以我真的想知道哪些类型的内存泄漏仍然是修补版本的IE6和IE7的问题,以及如何使用工具帮助我在我的实时代码中有效地找到它们.

有帮助吗?

gbl*_*zex 2

我认为没有有效的工具来检测内存泄漏。不过,您可以使用一款软件在 PC 上模拟 IE 6-7-8,它称为IE Tester

Internet Explorer 最常见的泄漏是与 JScript 的交互。

当 DOM 对象包含对 JavaScript 对象(例如事件处理函数)的引用时,并且当该 JavaScript 对象包含对该 DOM 对象的引用时,就会形成循环结构。 - http://javascript.crockford.com/memory/leak.html

这种循环结构是 IE 很难处理的。您应该了解循环引用是如何形成的(通过闭包)。第一步是在删除 DOM 元素之前清理它们。

这可以通过像这样的通用函数来完成:

function purge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            purge(d.childNodes[i]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

每次从 DOM 中删除元素时,您都需要purge先使用它。您甚至可以为此编写一个包装器

function safeRemove(el) {
  purge(el);
  el.parentNode.removeChild(el);
}
Run Code Online (Sandbox Code Playgroud)

当然,这只是一个起点,因为它不会帮助您在其他地方进行引用(例如 DOM2 事件处理程序,或通过closure的其他任何地方)。您应该检查删除元素的位置,并找出哪些函数引用了它们。

这个问题在IE 6-7-8中似乎仍然存在。