Javascript 関数で、変数の変換がjQuery
繰り返し使用される場合、最初にローカル変数に割り当てることができる場合があります。
$variable = $(variable);
これは必要ですか?変換のコストはいくらですか?
Javascript 関数で、変数の変換がjQuery
繰り返し使用される場合、最初にローカル変数に割り当てることができる場合があります。
$variable = $(variable);
これは必要ですか?変換のコストはいくらですか?
何があっても、オブジェクトを保存する方が、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();
がとにかく呼び出されている場合、$(variable)
この割り当てには基本的にコストがかかりません。これは、オブジェクトへの参照をメモリに格納するだけです。
純粋主義者は、jQuery オブジェクトが保存されているため、ガベージ コレクションを実行できないと指摘するかもしれませんが、これは事実です。したがって、これらがたくさんあると、メモリの問題が発生する可能性があると思いますが、それ自体は言うまでもありません。
それが行われる理由は、部品であるオブジェクトの作成に関連するコストがあるためです$(variable)
。何度も行うと、費用がかかる可能性があります。オブジェクトへの参照を保存すると、作成する必要があるのは 1 つだけになります。
もう 1 つの重要なポイント: 次のステートメント
var $variable = $(variable);
クロージャーの呼び出しコンテキストで行われると、異なる動作をする可能性があります。つまり、var ステートメントのスコープ内に関数が定義されている場合、その変数はその関数が使用するために「固定」されます。これにより、上記と同じ効果 (gc とポインター メモリなし) が得られ、有効期間が長くなる可能性があります。(関数が呼び出される可能性がある限り、それはとどまるためです。)