首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Do事件处理程序函数将导致内存泄漏,这是指外部作用域元素。

Do事件处理程序函数将导致内存泄漏,这是指外部作用域元素。
EN

Stack Overflow用户
提问于 2015-04-21 09:11:03
回答 1查看 48关注 0票数 0

Do事件处理程序函数将导致内存泄漏,内存泄漏的外部作用域中有元素。

例如:

代码语言:javascript
运行
复制
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)时,会导致内存泄漏。不对外部变量进行裁剪会解决这个问题吗?(我仍然怀疑)

请帮我理解一下。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-21 09:15:11

当事件处理程序函数引用外部范围html对象(btnItem)时,会导致内存泄漏。

这不是泄漏,但是的,它将调用makeLableEditable的“执行上下文”保存在内存中,如果btnItem引用的是稍后可能被垃圾收集的内容,则会将其保存在内存中。您正在创建的函数在上下文中有“闭包”,因此它们将其保存在周围。

但这不是泄密。如果删除了btnItem引用的元素,或者删除了它的firstChild元素,那么事件处理程序就不再具有引用它们的任何内容,因此它们就有资格使用GC --因此,它们在内存中保存的任何内容都有资格使用GC。

Internet在某些情况下没有成功地清理问题,但我不认为这会引发问题,而且我相信IE9+在任何情况下都能正确地处理这些情况。

不对外部变量进行裁剪会解决这个问题吗?

理论上,这些函数是否引用btnItem并不重要,它们将执行上下文保存在内存中。

在实践中,只要优化除了减少内存消耗等之外没有明显的副作用,JavaScript引擎就可以优化事物。因此,现代发动机聪明的“优化”关闭,而不是保持不必要的东西。它们并不完美,但只要您的代码不使用evalnew Function (而您的代码不使用),引擎通常可以优化简单的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29767763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档