我创建了一个非常简单的测试用例,该用例创建了Backbone视图,将处理程序附加到事件,并实例化了用户定义的类。我相信,通过单击此示例中的“删除”按钮,将清除所有内容,并且不会出现内存泄漏。
该代码的jsfiddle在这里:http : //jsfiddle.net/4QhR2/
// scope everything to a function
function main() {
function MyWrapper() {
this.element = null;
}
MyWrapper.prototype.set = function(elem) {
this.element = elem;
}
MyWrapper.prototype.get = function() {
return this.element;
}
var MyView = Backbone.View.extend({
tagName : "div",
id : "view",
events : {
"click #button" : "onButton",
},
initialize : function(options) {
// done for demo purposes only, should be using templates
this.html_text = "<input type='text' id='textbox' /><button id='button'>Remove</button>";
this.listenTo(this,"all",function(){console.log("Event: "+arguments[0]);});
},
render : function() {
this.$el.html(this.html_text);
this.wrapper = new MyWrapper();
this.wrapper.set(this.$("#textbox"));
this.wrapper.get().val("placeholder");
return this;
},
onButton : function() {
// assume this gets .remove() called on subviews (if they existed)
this.trigger("cleanup");
this.remove();
}
});
var view = new MyView();
$("#content").append(view.render().el);
}
main();
但是,我不清楚如何使用Google Chrome的探查器来验证是否确实如此。堆探查器快照上显示了无数个庞大的信息,而且我不知道如何解码优缺点。到目前为止,我所看过的教程只是告诉我“使用快照事件探查器”,或者就整个事件探查器的工作原理给了我非常详尽的宣言。可以仅将探查器用作工具,还是真的必须了解整个项目是如何设计的?
编辑:像这样的教程:
从我所见,可以代表一些更强的材料。但是,除了介绍3快照技术的概念外,我发现它们在实践知识方面提供的很少(对于像我这样的初学者)。“使用DevTools”教程无法通过一个真实的示例进行工作,因此它对事物的含糊且笼统的概念描述并不太有用。至于“ Gmail”示例:
所以您发现了一个泄漏。怎么办?
检查“轮廓”面板下半部分中泄漏物体的固定路径
如果无法轻易推断出分配站点(即事件侦听器):
通过JS控制台检测保留对象的构造函数,以保存堆栈跟踪以进行分配
使用闭包?启用适当的现有标志(即goog.events.Listener.ENABLE_MONITORING)以在构造期间设置creationStack属性
阅读后,我发现自己更加困惑,而不是更少。再说一遍,这只是告诉我去做事情,而不是如何去做。从我的角度来看,那里的所有信息要么太含糊,要么只对已经了解该过程的人有意义。
以下@Jonathan Naguin的答案提出了其中一些更具体的问题。
main
10,000次而不是一次,并查看最后是否使用了更多的内存。