我已经阅读了一些有关javascript内存泄漏模式的文章(例如MSDN article,IBM article)。
我理解将一个处理程序(例如onclick)属性附加到元素会因为处理程序关闭该元素而产生泄漏:
var elem = document.getElementById('foo');
elem.onclick = function () {
// Creates leak
}
我的问题:addEventListener / attachEvent接口是否会导致同样的问题?它们的功能也不要靠近元素,并且出于同样的原因不会导致泄漏吗?
var elem = document.getElementById('foo');
elem.addEventListener('click', function () {
// Doesn't this also close over elem?
}, false);
如果以上不会导致泄漏,为什么不呢?如果没有,那么这个代码对于attachEvent来说有什么不同,哪个MSDN说会导致泄漏(我知道attachEvent很快就会过时,但在那里提供了例子)?
function AttachEvents(element)
{
// This structure causes element to ref ClickEventHandler
element.attachEvent("onclick", ClickEventHandler);
function ClickEventHandler()
{
// This closure refs element
}
}
function SetupLeak()
{
// The leak happens all at once
AttachEvents(document.getElementById("LeakedDiv"));
}