1

さまざまなフォーム入力をバインドする関数があります

function bindInputs() {
    $(".inputContainer").each(function(i){
        var inputContainer = $(this),
            input = $("input.input", inputContainer),
            inputType = inputContainer.attr("data-inputType"),
            input_Id = inputContainer.attr("id").replace("inputContainer_", "");


        if(inputType == "TextEditor") {
            input.unbind("change").bind("change", function() {
                inputContainer.removeClass("nullValue");
                var value = input.val();
                saveInputValue(input_Id, value);
            });

            return true;
        }

        if(inputType == "NumericEditor") {
            input.numeric({ allow: "." });
            input.unbind("change").bind("change", function() {
                inputContainer.removeClass("nullValue");
                var value = getNumericValue(input.val());
                saveInputValue(input_Id, value);
            });
        }

        // so on
    });
};

この関数はメモリリークを引き起こしていますか?私が心配しているのは、すべての共有変数を最上位に保持し、それらを「change」コールバック関数内で使用することです。

コールバック関数の共有変数を再計算すると違いがありますか?

if(inputType == "TextEditor") {
    input.unbind("change").bind("change", function() {
        var elem = $(this),
            inputContainer = elem.closest(".inputContainer"),
            input_Id = inputContainer.attr("id").replace("inputContainer_", "");

        inputContainer.removeClass("nullValue");
        var value = input.val();
        saveInputValue(input_Id, value);
    });

    return true;
}
4

1 に答える 1

6

リークは発生していません。それらの関数がメモリ内にある限り、それらの変数をメモリ内に保持します。

それをやりたいかどうかはあなた次第ですが、それはトレードオフです。ハンドラーの場合change、DOMの再クエリのオーバーヘッドは最小限であるため、2番目の例を使用できますが、その例で保持しているものの実際のメモリへの影響はかなり最小限です。ハンドラーでは、ハンドラーは非常に迅速に作業を行う必要があるmousemoveため、おそらく逆の方向に進みます。mousemove

以下のコメントであなたの質問を再確認してください:

2番目のアプローチを選択すると言って、ブラウザが上位の変数を保存しないようにするにはどうすればよいですか?関数の最後でそれらをnullに設定しましたか?

関数が関数内のにも依存しないようにする場合は、bindInputs関数の外部で完全に定義します。次に、への呼び出しのコンテキスト全体でクロージャを作成することはなく、bindInputsそのコンテキストを(含まれる変数とともに)GCすることができます。変数をnullまたはに設定するか、またはundefinedに設定するだけでは、変数は削除されません。(その時点では、それらを含むコンテキストはかなり小さいです。特に何も参照しない3つまたは4つの変数だけです。)nullundefined

これは次のようになります。

function bindInputs() {
    $(".inputContainer").each(function(i){
        var inputContainer = $(this),
            input = $("input.input", inputContainer),
            inputType = inputContainer.attr("data-inputType");


        if(inputType == "TextEditor") {
            input.unbind("change").bind("change", handleTextEditorChange);

            return true;
        }

        if(inputType == "NumericEditor") {
            input.numeric({ allow: "." });
            input.unbind("change").bind("change", handleNumericEditorChange);
        }

        // so on
    });
}

function handleTextEditorChange() {
    // ...implementation...
}

function handleNumericEditorChange() {
    // ...implementation...
}
于 2012-12-12T09:56:20.677 に答える