しばらくの間、クロージャに関する JS ガベージ コレクションのルールについて確信が持てなかったので、質問したほうがよいと思います... jQuery の$.each
メソッドを使用することに興味がある良い例を次に示します。
storeSelection: function() {
var enabledIds = {};
$.each(this.nodes, function(index, node) {
if (node.enabled) {
enabledIds[ node.id ] = true;
}
});
this.selection = enabledIds;
}
もちろん、上記のスニペットはオブジェクト リテラルの一部です。そこで、有効なアイテムの ID を配列内に格納する新しいオブジェクトを外側の関数の先頭に作成しました。jQuery の.each()
メソッドを使用して、アイテムの配列をループし、有効な ID をログに記録しています。最後に、選択範囲を親オブジェクトのメンバーとして保存します。
enabledIds
私の質問には、外部スコープからオブジェクトを参照する内部関数が含まれます。くっついてしまうのでenabledIds
、内部機能が溜まらないのでしょうか?内部関数の最後にクリアされるのは単なる変数なので、そうではないと思いますよね?リークになるには、次のように、内部関数が外部オブジェクトへのハード参照を作成する必要があると思います。
$.each(this.nodes, function(index, node) {
this.badIdea = enabledIds;
if (node.enabled) {
enabledIds[ node.id ] = true;
}
});
しかし... 私はいつもこのルールにうんざりしています。この混乱を解消するための助けをいただければ幸いです。