2012-04-16 18 views
5

私は過去4ヶ月間Webプロジェクトに取り組んでいます。コードのパフォーマンスを最適化するために、パターンを使用しました。私の疑いは、それは実際にパフォーマンスを高めるかどうかですか?javascript this object

thisオブジェクトをローカル変数に割り当てて使用する必要があるときは、その変数を使用します。

function someFunction() 
{ 
    var thisObject = this; 
    //use thisObject in all following the code. 
} 

ここでの仮定は、ローカル・スタック変数にthisオブジェクトを割り当てると、パフォーマンスを後押しする、ということです。

私はこのタイプのコーディングをどこにも見ていないので、それが役に立たない場合は疑いがありません。

編集:このオブジェクトをローカル変数に割り当てることは、オブジェクトを保存するために行われることがわかっていますが、これは私たちのケースではありません。

+1

これはNode.jsのものでは非常に一般的です。しかし、それは私が信じているパフォーマンスの向上とは対照的に、コールバックのリファレンスを保持するためのものです。 – Chad

+1

私はこれがパフォーマンスのために実際に悪い*であると推測します。 Google Closure Compiler(高度な最適化機能を持つ)では、var宣言が削除され、 'thisObject'のインスタンスが' this'に置き換えられます。変数を使用するとサイズが小さくなることがよくあります。クローズコンパイラは速度とサイズを最適化しますが、選択肢がある場合はサイズよりも速度が優先されるようです。 –

答えて

7

これはJavascriptの一般的なプラクティスですが、パフォーマンス上の理由からではなくです。 thisオブジェクトを別の名前付きローカルに保存すると、通常、関数内で定義されているコールバック全体にわたって値thisが保持されます。それは

var o = {} 
o.someFunction = someFunction(); 
var callback = o.someFunction(); 
callback();  // prints false 
callback.call(o); // prints true 
+0

このパターンは、コールバックなどを持たない単純な関数で使用しています。私が知りたがっているのは、パフォーマンスが向上しているということですか? –

+0

@TejeshAlimilliこれはパフォーマンス上の違いが目立つことはほとんどありません – JaredPar

+0

ありがとうございます。それは私が知りたかったものです。 –

0

と呼ばれていますどのように依存します

function someFunction() { 
    var thisObject = this; 
    var someCallback = function() { 
    console.log(thisObject === this); // Could print true or false 
    }; 
    return someCallback; 
} 

trueと評価thisObject === thisかどうかは、最適化のこの種は、(正の)効果を持っている場合でも、インタプリタに依存する可能性が非常に高いです。

他のリリースでは、結果が逆転する可能性があります。

しかし、最終的には、測定して、推測する必要はありません。

2

すべてのパフォーマンスに関する質問と同様に、パフォーマンスを実際に測定して調べる必要があります。 rather simple test case(あなたの実際のコードは、いくつかの異なる場合があります)で、私は、ブラウザ間で混合結果を見つける:

enter image description here

ChromeとFirefoxの2回のテストの間であまり違いはありませんが、若干の違いが反対であります2つの間の方向。 IE9は、私がselfと呼んだthisの保存されたコピーを使用してテストを大幅に遅くすることを示しています。

ChromeとFirefoxおよびIE9のテストケースが大幅に高速であることを示すthisのテストケースでは、有意義な一貫したパフォーマンスの差異がなければ、質問したデザインパターンはブラウザ間で一貫したパフォーマンス向上をもたらしていないと結論できます。

は私のコードでは、私がthisが何か他のものに設定されているインラインのイベントハンドラ、コールバックやメソッドの内部に、元のオブジェクトへの一貫した参照のためにそれを必要とするだけで、別の変数にthisのコピーを保存します。言い換えれば、私は必要なときにこのデザインパターンを適用するだけです。 previous discussion of this design pattern here on SO

は、それはいくつかのライブラリがthisはそれが占めて4つの文字の下に縮小されていない可能性があるため、追加の最小化を可能にするために、このデザインパターンを使用すると結論づけられたが、ローカル変数に代入することに縮小さすることができます単一文字の変数名。

+0

オペラはテストケースをマイクロ最適化するようですが、まったく同じ時間で実行しています:-) – Bergi