相关疑难解决方法(0)

你知道什么可能导致JavaScript中的内存泄漏吗?

你知道什么可能导致JavaScript中的内存泄漏吗?我对浏览器感兴趣:IE 7,FireFox 3,Safari 3

javascript memory-leaks

23
推荐指数
2
解决办法
8450
查看次数

精确解释JavaScript < - > DOM循环引用问题

jQuery.data与原始expando属性(可以分配给DOM节点的任意属性)的一个被吹捧的优点是jQuery.data "不受循环引用的影响,因此没有内存泄漏".谷歌的一篇名为"优化JavaScript代码"的文章详细介绍:

Web应用程序最常见的内存泄漏涉及JavaScript脚本引擎和实现DOM的浏览器的C++对象之间的循环引用(例如,在JavaScript脚本引擎和Internet Explorer的COM基础结构之间,或者在JavaScript引擎和Firefox XPCOM基础结构之间).

它列出了两个循环引用模式的示例:

  • DOM元素→事件处理程序→闭包范围→DOM

  • DOM元素→通过expando→中间对象→DOM元素

但是,如果DOM节点和JavaScript对象之间的引用循环产生内存泄漏,这是否意味着任何非平凡的事件处理程序(例如onclick)都会产生这样的泄漏?我不知道事件处理程序如何避免引用循环,因为我看到它的方式:

  • DOM元素引用事件处理程序.

  • 事件处理程序引用DOM(直接或间接).在任何情况下,几乎不可能避免window在任何有趣的事件处理程序中引用,而不是编写setInterval从全局队列中读取操作的循环.

有人可以提供JavaScript↔DOM循环引用问题的精确解释吗?我想澄清的事情:

  • 什么浏览器受影响?jQuery源代码中的评论专门提到IE6-7,但谷歌文章表明Firefox也受到了影响.

  • expando属性和事件处理程序在内存泄漏方面有何不同?或者这些代码片段是否容易受到同类内存泄漏的影响?

    // Create an expando that references to its own element.
    var elem = document.getElementById('foo');
    elem.myself = elem;
    
    // Create an event handler that references its own element.
    var elem = document.getElementById('foo');
    elem.onclick = function() {
        elem.style.display = 'none';
    };
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果页面由于循环引用而泄漏内存,则泄漏是否会持续到整个浏览器应用程序关闭,或者窗口/选项卡关闭时是否释放内存?

javascript internet-explorer memory-management

10
推荐指数
1
解决办法
2210
查看次数