10

Javascript 関数で、変数の変換がjQuery繰り返し使用される場合、最初にローカル変数に割り当てることができる場合があります。

$variable = $(variable);

これは必要ですか?変換のコストはいくらですか?

4

3 に答える 3

6

何があっても、オブジェクトを保存する方が、jQuery メソッドを使用するたびに jQuery オブジェクトを再インスタンス化する必要があるよりも高速です...たとえキャッシュ$(this)$(anObject).

この「保存して後で使用する」という方法を説明するために使用される用語が「キャッシング」です。「キャッシング」と呼ばれることが多い理由は、キャッシングとは、何かへの参照を一度保存​​し、それを使用して、後で同じものを取得するために戻る必要がないためです (非常に非技術的で、100% 正確ではない説明)。

主要なポイントはセレクターの扱いです。jQuery は毎回 DOM にクエリを実行する必要があり、これはコストのかかる部分です。オブジェクトの生成と参照の保存は、DOM 操作 (および最初に選択を処理する jQuery) に比べてそれほど高価ではありません。

オブジェクト参照から単に jQuery オブジェクトを作成している場合、実行される処理は jQuery オブジェクトの作成であるため、それほど壊滅的ではありません...そのため、jQuery がそのために行うことは本当に限られています。これは良い習慣であり、不必要な処理を防ぎます。たとえば、次のようになります。

var element = document.getElementById("div_id");
$(element).someMethod();
// Later:
$(element).someOtherMethod();

毎回新しい jQuery オブジェクトが作成されるため、少し非効率的です。単一の jQuery オブジェクトへの参照を変数に格納し、それを参照するように簡単に要約できます。

私が考えることができる1つの注意点は、それが要素のライブリストではないということです(DOM要素を選択した場合)。たとえば、次のように、すべての要素を classtesting-classでキャッシュしたい場合があります。

var myelements = $(".testing-class");

testing-classただし、クラスでDOM に別の要素を追加した場合はmyelements反映されません。以前のリストと同じになります。したがって、その場合、明らかに DOM を再クエリして update する必要がありますmyelements

私にとって、キャッシュのベスト プラクティスは、ページ全体ではなく、範囲内です。関数を実行していて、いくつかの要素を選択する場合は、最初にキャッシュして、それを使用します。ただし、グローバルにキャッシュしてページ全体で使用しないでください。実行サイクルのためにキャッシュします。

たとえば、次のようにします。

function someFunc() {
    var elements = $(".class-stuff");
    // Use `elements` here

    // code

    // Use `elements` here
    someOtherFunc(elements);
}

function someOtherFunc(el) {
    // Use `el` here
}

someFunc();

// Some time later:
someFunc();

しかし、私はこれをしません:

var elements = $(".class-stuff");

function someFunc() {
    // Use `elements`
}

function someOtherFunc() {
    // Use `elements`
}

someFunc();
someOtherFunc();

// Some time later
someOtherFunc();
于 2013-04-25T18:45:44.257 に答える
0

がとにかく呼び出されている場合、$(variable)この割り当てには基本的にコストがかかりません。これは、オブジェクトへの参照をメモリに格納するだけです。

純粋主義者は、jQuery オブジェクトが保存されているため、ガベージ コレクションを実行できないと指摘するかもしれませんが、これは事実です。したがって、これらがたくさんあると、メモリの問題が発生する可能性があると思いますが、それ自体は言うまでもありません。

それが行われる理由は、部品であるオブジェクトの作成に関連するコストがあるためです$(variable)。何度も行うと、費用がかかる可能性があります。オブジェクトへの参照を保存すると、作成する必要があるのは 1 つだけになります。

もう 1 つの重要なポイント: 次のステートメント

var $variable = $(variable);

クロージャーの呼び出しコンテキストで行われると、異なる動作をする可能性があります。つまり、var ステートメントのスコープ内に関数が定義されている場合、その変数はその関数が使用するために「固定」されます。これにより、上記と同じ効果 (gc とポインター メモリなし) が得られ、有効期間が長くなる可能性があります。(関数が呼び出される可能性がある限り、それはとどまるためです。)

于 2013-04-25T18:46:34.130 に答える