location.hrefはwindow.location.hrefよりも高速です。しかし、内部的にlocation.hrefはwindow.location.hrefとして読み取られていますよね?では、どのようにして大幅なパフォーマンスを向上させるのでしょうか。
4 に答える
location.hrefはwindow.location.hrefよりも高速です。
非常に高速かもしれませんが、実際には何も気付かないでしょう。理由は次のとおりです。
エンジンが(理論的には)見たときに何をするかを次に示しますlocation.href
。
location
現在のスコープで検索します。見つからない場合は、包含スコープなどに移動し、最終的にグローバルスコープに到達します。- グローバルスコープで
location
は、グローバルオブジェクトのプロパティとして検出されます。 - 次に
href
、オブジェクトのプロパティを検索しlocation
ます。
エンジンが(理論的には)見たときに何をするかを次に示しますwindow.location.href
。
window
現在のスコープで検索します。見つからない場合は、包含スコープなどに移動し、最終的にグローバルスコープに到達します。- グローバルスコープで
window
は、グローバルオブジェクトのプロパティとして検出されます。これは、グローバルオブジェクトがそれ自体を参照するために使用するプロパティです。 - 次に
location
、そのオブジェクトのプロパティを検索します。 - 次に
href
、オブジェクトのプロパティを検索しlocation
ます。
そのため、JavaScriptエンジンが適用できる可能性のある最適化を除いて、window.location.href
プロパティルックアップが1つ多く必要になります。location.href
しかし、JavaScriptのパフォーマンスはエンジンごとに非常に異なります。あなたのマイレージは異なる場合があります。これは、 FB55がまとめたベンチマークであり、上記の理論が実験結果によって裏付けられていることを示しています。確かに速いです。その特定のテストで。location.href
(青= location.href
、赤= window.location.href
;長い線=より速いパフォーマンス。)
もっと要点:それは本当に重要ですか?現実の世界ではありません。人間が知覚できる違いがあるためには、これを何百万回も実行する必要があります。location
しかし、それが、 (または他のグローバル、組み込み、または独自のコードによって追加された)グローバルについて人々がこれを言っているのを見る理由の説明です。
これに関するいくつかの考え:
- ブラウザで
window
は、はグローバルオブジェクトであるため、割り当てられたすべてのプロパティに参照せずにアクセスできます。どちらの場合も、変数は周囲のすべてのスコープで検索する必要があります(読み取り:ウィンドウオブジェクトも検索する必要があります)。 - コストのかかる検索を回避するために、最近のほとんどのブラウザは「インラインキャッシング」(IC)と呼ばれる手法を実装しました。簡略化すると、常に正しいオブジェクトを指していることを意味します。
とにかく、私は簡単なベンチマークを作成しました。どうやら、直接アクセスはより高速です(少なくともChromeでは)。
document.locationは非推奨になりました。window.locationはグローバルオブジェクトであるため、場所だけでアクセスできます。
ロケーションオブジェクトには、複数のプロパティとメソッドがあります。文字列として使用しようとすると、location.hrefのように機能します。安全を期すために、常にlocation.hrefを使用するのが最善です。
一見すると、それらは同じことをします。フレームを使用している場合、それらは異なる動作をする可能性があります。
その場合、それらは異なる値を返す可能性があり、おそらくフレームの入れ子の複雑さに応じてパフォーマンスの違いがありますが、フレームのものを無視すると、同時に同じことを行う必要があります。
これについてどこで読んだかを明記してください。
HTH