Do事件处理程序函数将导致内存泄漏,内存泄漏的外部作用域中有元素。
例如:
function makeLableEditable(btnItem)
{
x.addDOMListener(btnItem.firstChild, 'onmousedown', function(){
btnItem.parentElement.setAttribute('draggable', false);
});
x.addDOMListener(btnItem.firstChild, 'onmouseup', function(){
btnItem.parentElement.setAttribute('draggable', true);
});
}当事件处理程序函数引用外部范围html对象(btnItem)时,会导致内存泄漏。不对外部变量进行裁剪会解决这个问题吗?(我仍然怀疑)
请帮我理解一下。
发布于 2015-04-21 09:15:11
当事件处理程序函数引用外部范围html对象(btnItem)时,会导致内存泄漏。
这不是泄漏,但是的,它将调用makeLableEditable的“执行上下文”保存在内存中,如果btnItem引用的是稍后可能被垃圾收集的内容,则会将其保存在内存中。您正在创建的函数在上下文中有“闭包”,因此它们将其保存在周围。
但这不是泄密。如果删除了btnItem引用的元素,或者删除了它的firstChild元素,那么事件处理程序就不再具有引用它们的任何内容,因此它们就有资格使用GC --因此,它们在内存中保存的任何内容都有资格使用GC。
Internet在某些情况下没有成功地清理问题,但我不认为这会引发问题,而且我相信IE9+在任何情况下都能正确地处理这些情况。
不对外部变量进行裁剪会解决这个问题吗?
理论上,这些函数是否引用btnItem并不重要,它们将执行上下文保存在内存中。
在实践中,只要优化除了减少内存消耗等之外没有明显的副作用,JavaScript引擎就可以优化事物。因此,现代发动机聪明的“优化”关闭,而不是保持不必要的东西。它们并不完美,但只要您的代码不使用eval或new Function (而您的代码不使用),引擎通常可以优化简单的情况。
https://stackoverflow.com/questions/29767763
复制相似问题