为什么在这个JavaScript中有内存泄漏?

Why is there a memory leak in this JavaScript?

本文关键字:内存 泄漏 JavaScript 为什么      更新时间:2023-09-26
function addHandler( ) 
{
    var el = document.getElementById('el');
    el.onclick = function( ) 
    {
    this.style.backgroundColor = 'red';
    };
}

为什么上面的JavaScript块有泄漏?

在今天的浏览器中没有内存泄漏。但是,在较旧的IE版本中,此代码确实会产生泄漏。

如果垃圾收集器无法删除对象,因为它仍然在某处被引用,则会发生内存泄漏。早期的垃圾收集器在循环引用方面存在问题,即当对象A引用对象B时,反之亦然。

在旧的IE版本中就是这种情况:el有一个对函数的引用,因为该函数被设置为onclick属性的值(这应该是显而易见的)。
但是这个函数也有对el的引用,因为它是对el闭合的闭包。这是循环引用

代码中唯一分配内存的是附加到on click事件的新函数。

没有内存泄漏,但是如果动态创建数百万个元素,并为每个元素调用此函数,则可能导致高内存占用。