Javascript 我是否正在创建内存泄漏?
我有一个JavaScript闭包,在我的web应用程序的整个生命周期(单个完整的ajax页面)中不断地重新创建它 我想知道它是否造成了内存泄漏 这里有一个例子 有关守则:Javascript 我是否正在创建内存泄漏?,javascript,memory-leaks,Javascript,Memory Leaks,我有一个JavaScript闭包,在我的web应用程序的整个生命周期(单个完整的ajax页面)中不断地重新创建它 我想知道它是否造成了内存泄漏 这里有一个例子 有关守则: function CreateLinks() { var ul = $("<ul></ul>").appendTo('div#links'); for (var i in myLinks) { var li = $('<li>' + myLinks[i]
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);
}
}
函数CreateLinks(){
var ul=$(“
”)。附录('div#links');
用于(MyLink中的var i){
var li=$(''+myLinks[i].name+' ).appendTo(ul);
//结束从这里开始
(功能(值){
li.点击(功能(e){
$('div#info')。追加(''+value+'
');
重新创建链接();
});
})(myLinks[i].值);
}
}
如果您确保避免绑定多个单击重新创建链接()函数中的处理程序,您应该不会有问题;这可以通过显式解除现有节点的绑定、删除DOM节点或确保不会添加多个单击处理程序来实现
浏览器在内存分配策略方面越来越好,但你不应该假设太多。如果内存使用是一个大问题,请尽量避免创建太多的闭包,因为您不确定这些闭包是否会被垃圾收集。其中一种方法是使用.data()
存储您的值对象,然后使用通用的单击处理程序而不是闭包
分析JavaScript并不是那么简单;Chrome确实有一个配置文件工具,可以监控CPU和数据性能。这可以很好地衡量预期的内存消耗,但Chrome并非所有浏览器,请记住这一点。根据浏览器的智能程度,在
上设置“myLinks[i].value”属性可能比通过闭包传递更好。当事件处理程序从其作用域之外引用变量时,某些哑浏览器在收集垃圾时会出现问题。JavaScript和DOM运行两个不同的GC,JS没有意识到DOM元素/eventhandler已经消失,变量不再使用。通过javascript正确删除事件处理程序,而不仅仅是处理它所附加的元素,可以解决这个问题
类似于:
li.attr('lvalue',myLinks[i].value);
...
var value = $(this).attr('lvalue');
此设置还允许您使用
$('#links > ul > li').live('click',function(){...});
这样就不需要每次都添加单独的事件。在这里结束有什么意义?为什么不说var value=myLinks[i].value代码>然后直接运行代码?@Jacob:哦,我明白了。你的意思是myLinks[i]。value
,对。上面的代码中没有内存泄漏。但是解决这个问题的方法太复杂了闭包有目的性,测试并与我的问题进行比较。。。这一个只输出所有链接的“tres”。您不能将调用放入setInterval(方法,10)
并查看操作系统统计数据,查看浏览器应用程序的内存是否增加?我知道除了闭包还有很多事情要做,但是jQuery的内存效率很高,闭包不是只被li
元素引用,这些元素在rescreatelinks()
中被删除了吗?我无法从rescreatelinks()
访问li
单击处理程序。也许您可以更新JSFIDLE并告诉我您的意思。@capdragon删除元素本身也可以。除非您确定您从未多次绑定单击事件,这提醒我您也可以使用.one()@capdragon添加了另一个您可以采纳的建议。@Jack我感谢您的建议(+1)。尽管如此,仍不乏变通办法或解决方案。我只是想知道关闭是否造成内存泄漏。我想要一些证据来证明这一点和/或我自己可以看到的方法。(+1)谢谢你的建议,这会有用的。。。事情是myLinks[i]。值在我的应用程序中是一个相当大的对象。也就是说,它是一个具有许多属性和方法的对象。我在这里把它简单化,作为一个例子。我认为将每个属性/方法映射到li属性是不好的。@capdragon您可以在代码中使用js对象,并在li标记上使用该对象的id。您是对的,我认为这是另一种方式。不过,我真的只是想知道关闭是否会造成内存泄漏。我想要一些证据来证明这一点和/或我自己可以看到的方法。我希望这样的工具存在,从我的经验来看,跟踪网页的内存或cpu使用几乎是不可能的。