【发布时间】:2010-05-03 07:15:29
【问题描述】:
在一篇文章中,我看到最好清除 window.unload 事件上的所有 expandos 以防止内存泄漏。
我不明白为什么要这样做。
浏览器不是在你离开页面后清理所有 DOM 及其相关资源吗?
谢谢,
布拉克·奥兹多安
【问题讨论】:
标签: javascript dom memory-leaks custom-properties
在一篇文章中,我看到最好清除 window.unload 事件上的所有 expandos 以防止内存泄漏。
我不明白为什么要这样做。
浏览器不是在你离开页面后清理所有 DOM 及其相关资源吗?
谢谢,
布拉克·奥兹多安
【问题讨论】:
标签: javascript dom memory-leaks custom-properties
嘿,好问题。问题在于 JavaScript 对象和 DOM 节点之间的循环引用。
假设您有一个指向 DOM 节点的全局 JavaScript 对象,并且该节点有一个 expando 属性返回该对象。当页面卸载时,脚本引擎“清空”JavaScript 对象,使其不再指向 DOM 节点。但是,它不能从内存中释放对象,因为仍然存在对它的引用(来自 DOM)。然后脚本引擎终止。
DOM 上的Expando 属性只不过是对其他对象的引用。清理 DOM 时,它会破坏这些引用,但假定对象仍在使用中。在本例中,DOM 等待脚本引擎清理属于它的对象,但脚本引擎已经终止。
所以,问题在于 DOM 只处理属于它的内存,并假设脚本引擎也会这样做。
我希望这会有所帮助。
见:http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx
【讨论】: