12

ここにそのようなJSコードがあるとすると:

  for (var i = 0; i < document.getElementsByName('scale_select').length; i++) {
    document.getElementsByName('scale_select')[i].onclick = vSetScale;
  }

getElementsByNameの結果をループの前に変数に入れ、その後で変数を使用すると、コードが速くなりますか?

実生活での効果の大きさはよくわかりませんgetElementsByName。通常、アイテムが10個未満の場合に発生します。とにかく、基礎となるメカニズムを理解したいと思います。

また、2つのオプションについて他に注目すべき点があれば、教えてください。

4

8 に答える 8

17

間違いなく。保存に必要なメモリは、DOMオブジェクトへのポインタにすぎず、何かを使用する必要があるたびにDOM検索を実行するよりもはるかに簡単です

理想的なコード:

var scale_select = document.getElementsByName('scale_select');
for (var i = 0; i < scale_select.length; i++)
    scale_select[i].onclick = vSetScale;
于 2008-09-22T13:37:13.803 に答える
4

プロパティ ルックアップをキャッシュするといくらかは役立つかもしれませんが、ループを開始する前に配列の長さをキャッシュする方が高速であることが証明されています。

したがって、scale_select.length の値を保持する変数をループ内で宣言すると、ループ全体が多少高速化されます。

var scale_select = document.getElementsByName('scale_select');
for (var i = 0, al=scale_select.length; i < al; i++)
    scale_select[i].onclick = vSetScale;
于 2008-09-22T20:06:50.717 に答える
3

DOM のスマートな実装は独自のキャッシュを行い、何かが変更されるとキャッシュを無効にします。しかし、今日のすべての DOM がこれほどスマート (IE) であるとは限りません。

于 2008-09-22T13:59:44.763 に答える
1

原則として、getElementsByNameの結果をループの前に変数に入れ、その後に変数を使用すると、コードは高速になりますか?

はい。

于 2008-09-22T13:33:53.173 に答える
1

変数を使用します。JavaScriptではそれほど高価ではなく、関数呼び出しは間違いなく遅くなります。document.getElementById()を少なくとも5回ループする場合は、変数を使用します。ここでの考え方は、関数呼び出しが遅いだけでなく、この特定の関数はDOM内で指定されたIDを持つ要素を見つけようとするため、非常に遅いということです。

于 2008-09-22T13:37:45.550 に答える
1

@オリ

変数にフェッチされた要素の長さプロパティをキャッシュすることも良い考えです。

var scaleSelect = document.getElementsByName('scale_select');
var scaleSelectLength = scaleSelect.length;

for (var i = 0; i < scaleSelectLength; i += 1)
{
    // scaleSelect[i]
}
于 2008-09-23T12:10:18.183 に答える
1

scaleSelect.length を別の変数に格納しても意味がありません。実際にはすでに 1 つに含まれています。scaleSelect.length は、scaleSelect 配列の単なる属性であるため、他の静的変数と同じようにすばやくアクセスできます。

于 2009-03-26T14:41:38.297 に答える
0

そう思います。ループするたびに、エンジンはdocument.getElementsByNameステートメントを再評価する必要があります。

一方、値が変数に保存されている場合、それはすでに値を持っています。

于 2008-09-22T13:35:01.703 に答える