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 の回答で提起されています。