2016-12-26 5 views
0

私には1つの質問があり、わかりません。より良いパフォーマンスを得るためにオブジェクトに文書とウィンドウの参照を格納する

私はこのような私のpluins内のオブジェクトまたはグローバル変数にwindowdocumentを定義します。

var myplugin = { 
    document : document || {}, 
    window : window || {} 
}; 

私はこのような必要があるとき、私はその呼び出しの後:

myplugin.window.location.href = 'http://flyflyflymachine.etc'; 

そして、私が知りたいのですが私はいくつかのより良いパフォーマンスを得るか、不必要にですか?

+0

私たちは一般的に 'window.location'を使用していますか?他のものではありません。 –

+1

ええ、私は速く書いた。私の間違い。 –

+1

最初の質問、真剣に、なぜですか? –

答えて

1

プラグインではなく、オブジェクトリテラル初期化子を使用しての生命維持の観点で定義されている場合、ナノ最適化のこの種の作成入れ子関数に対してよりappplicableあります。

コードがオブジェクトの変数を参照する場合、javascriptエンジンは、変数またはオブジェクト定義が見つかるか、定義されていないことが証明されるまで、現在のレキシカルスコープレコードを最初に検索し、その後に親レキシカルスコープレコードを検索する必要があります。

可変範囲定義letを使用するループと、引数と変数を保持する関数のために、forループの字句範囲レコードが作成されます。深くネストされたforループでは、深くネストされた関数の中で、検査する範囲レコードがいくつかあり、その前にwindowまたはdocumentのいずれかを見つけることができます。

グローバルまたは外側の関数参照のコピーを作成すると、検索にスコープレコードの数を減らすことができます。純粋なパフォーマンスの向上は、コピーを作成するオーバーヘッドが中間範囲レコードを検索するJavaSriptエンジンのオーバーヘッドに外部参照が使用された回数を掛けたものよりも小さい場合にのみ発生します。これは実際には稀であり、利得が小さい場合には証明することは困難である。

ポストのプラグイン定義の種類は、IIFEの代わりに「オブジェクトオブジェクト」インテイラーで構成されているため、オブジェクト参照検索のスピードアップの基準を満たしておらず、実際には遅くなる可能性があります。

1

windowまたはdocumentが不安です。たとえば、このコードがWorkerまたはNodeJSスクリプトの内部から実行された場合、エラーが発生します。

ですから、二つの方法でこれを「最適化する」ことができます:

は使用古き良き

var myPlugin = {}; 
(function myPluginNS(_global) { 
    myPlugin.window = _global; 
    myPlugin.document = _global.document || {}; 
})(this); 

thisはグローバルオブジェクトを参照する、グローバルスコープから)thisキーワードで名前空間を使用しますあなたのコードが確実にバリデーションされていることを保証します。 JSの実行時間。

+0

ワーカー内部では、 'self'を使用して、ホストウィンドウオブジェクトのサブセットであるワーカー固有のウィンドウオブジェクトを参照します。あなたは' this'をその関数に渡すと言っています**間違っています** – Dummy

+0

@Dummy er .. can 'this'が動作しないスニペットを投稿しますか?これは私が書いたコードで動作します。そして、私はあなたが "窓"を持っていない労働者を考慮して "労働者特有の窓オブジェクト"と言って、物事をもっと混乱させているかもしれないと思う。それはグローバルスコープを持っています。 – DRAB

+0

'window'はグローバルスコープオブジェクトを取得するためのショートカットですが、このワイドスコープオブジェクトはワーカーでは使用できません。ワーカーの種類ごとに独自のスコープオブジェクトがあり、ワーカー内で' window'を使用するとエラーが発生します。 [共有ワーカーコンテキスト](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorkerGlobalScope)。 [専用ワーカーコンテキスト](https://developer.mozilla.org/en-US/docs/Web/API/DedicatedWorkerGlobalScope)。 – Dummy

2

パフォーマンスに関しては、キャッシュが有効ですが、ここでは何もキャッシュしていません。 1つのルックアップを別のルックアップに置き換えるだけである(yourplugin.documentwindow.document)。

実際にはdocumentのほうが速いですが、タイトなループで数千回呼び出すのでなければ、このようなナノの最適化を気にしないでください。理論的に

+0

Ooohh、OPは 'window'と' document'を参照して最適化しようとしていました!はい、同意しました、ただそれをしないでください。 – DRAB

+0

私が言うことができる限り、ええ、受け入れられた、精巧な答えで判断する、はい。 –

関連する問題