cap*_*gon 11 javascript memory-leaks
我有一个JavaScript闭包,我会在我的Web应用程序的整个生命周期中重新创建(单个完整的ajax页面).
我想知道它是否会造成内存泄漏.
这是一个JSFIDDLE示例
有问题的代码:
function CreateLinks() {
var ul = $("<ul></ul>").appendTo('div#links');
for (var i in myLinks) {
var li = $('<li>' + myLinks[i].name + '</li>').appendTo(ul);
//closure starts here
(function (value) {
li.click(function (e) {
$('div#info').append('<label>' + value + '</label><br />');
RecreateLinks();
});
})(myLinks[i].value);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您确保避免click
在函数中绑定多个处理程序,那么您应该没问题RecreateLinks()
;这可以通过显式解除现有节点的绑定、删除 DOM 节点或确保不会添加多个click
处理程序来完成。
浏览器在内存分配策略方面做得越来越好,但您不应该假设太多。如果内存使用是一个大问题,请尽量避免创建太多您不确定它们是否会被垃圾收集的闭包。一种这样的方法是使用.data()
存储值对象,然后使用通用点击处理程序而不是闭包。
分析 JavaScript 并不是那么简单;Chrome确实有一个Profile工具,可以监控CPU和数据性能。这可以让您很好地衡量预期的内存消耗,但 Chrome 并不是所有浏览器,请记住这一点。