【发布时间】:2013-02-09 02:23:34
【问题描述】:
我正在开发一个大量使用 Javascript 并包含大量 DOM 操作的项目。随着代码的增长,我注意到有时在 Internet Explorer (9) 下页面加载时 Javasript 执行会有延迟(大约 1-2 秒)。这种延迟在 Firefox 上从未发生过。
例如:
// the actual code contains much more stuff
$("body").append("<p>paragraph</p>");
虽然p 是动态生成的,但它应该在现代浏览器上的页面加载后立即看到。但在 IE 上,有时我可以清楚地看到 p 在所有静态内容加载后被添加,这使得整个页面变得跳跃。
如果我重新启动 IE,延迟就消失了。但是,如果进行了大量的 DOM 操作,它会在下一页刷新时再次发生。
所以我在想这是否是由memory leak 引起的,因为我很少使对象引用无效。
var foo = $("#foo");
foo.on("click", function() {
var bar = '<div id="bar">bar</div>';
$("body").append(bar);
// nullify bar
bar = null;
});
// nullify foo
foo = null;
问题:
是否应该像上面的示例一样在使用完 每个 对象引用后取消它们?
如果 Q1 的答案是否定的,我应该在什么时候或在什么情况下使对象引用无效?
除了无效之外,我还能做些什么来防止内存泄漏?
PS:几年前我读过一些类似的问题,它们主要针对 IE 6/7。
【问题讨论】:
-
您是否尝试过使对象无效,然后进行测试以查看内存泄漏会发生什么?对于这些类型的事情,通常没有非常明确的答案。基于该分析的分析和优化可能是您能做的最好的事情。但希望有人有更好的回应:)
-
我不确定你能否超越 IE 垃圾收集器的性能,但我可能是错的。如果你经常使用
.append和类似的函数,尤其是在循环中,它会占用大量内存;您可能想看看是否可以减少一点 -
在这个特定的例子中,将变量设置为 null 不会帮助你。您可以阅读 ie 特定策略(即 dom 和垃圾收集存在特定问题)。但首先...测量内存以确保您确实存在内存泄漏。
-
如果您正在使用循环执行某些操作,@ExplosionPills 的建议将通过在循环期间连接字符串中的所有 html 来实现,然后在循环完成后将整个内容附加一次.
-
@maxedison 不,我没有花时间使所有对象无效,因为代码有点长而且复杂。实际上我不太确定
how to trigger the problem在我的项目中。现在似乎是随机发生的。
标签: javascript jquery performance internet-explorer memory-leaks