2009-08-12 10 views
3

(1)以下のJavaScript関数を考えてみましょう:Javascriptのオブジェクトはいつ構築されますか?

function setData(domElement) { 
    domElement.myDataProperty = { 
    'suppose': 'this', 
    'object': 'is', 
    'static': 'and', 
    'pretty': 'big' 
    }; 
}; 

は今、私はこの機能については好きではないものを正確に同じオブジェクトは関数が呼び出されるたびに作成されていることです。オブジェクトは変わらないので、私はむしろ1回だけ作成します。スクリプトがロードされ、dataObjectに格納されている場合

var dataObject = { 
    'suppose': 'this', 
    'object': 'is', 
    'static': 'and', 
    'pretty': 'big' 
}; 

function setData(domElement) { 
    domElement.myDataProperty = dataObject; 
}; 

今すぐオブジェクトが一度作成されます。だから我々は、以下の調整(2)を作ることができます。しかし、setDataがときどきしか呼び出されないと仮定しましょう。スクリプトがロードされるほとんどの時間、関数は使用されません。その場合のこの機能について私が気に入らないのは、オブジェクトが常に使用されない場合を含め、常に作成されてメモリに保持されるということです。意味をなさない

var dataObject; 

function setData(domElement) { 
    if (!dataObject) { 
    dataObject = { 
     'suppose': 'this', 
     'object': 'is', 
     'static': 'and', 
     'pretty': 'big' 
    }; 
    } 
    domElement.myDataProperty = dataObject; 
}; 

う:私はあなたが理想的なバランス(3)を打つためにこのような何かを行うことができます考え出しましたか?私はインタプリタがオブジェクトを作成することをいつ決定するかによって決まると思います。 !dataObject状態になるまで待つか、関数に入り込んでスマートにしようとするのか、事前に構築することを決めるのか?おそらく異なるJavascriptエンジンにはこれに関するさまざまなポリシーがありますか?

もちろん、これらの最適化が実際に重要かどうかという疑問があります。明らかに、これはオブジェクトのサイズ、エンジンのスピード、利用可能なリソースの量などの要素に依存します。しかし、一般的には、(1)から(2)または(2)から(3)へ

答えて

2

答えは、あなたが知っているはずではありません。あなたが示した例は、それらの間の違いはほとんどありません。これについて妥当な心配をしている唯一の方法は、特定の通訳者のパフォーマンスやメモリ使用量に顕著な影響を与えているという実際の証拠がある場合です。それまでは、あなたのためにそのことを心配するのは通訳の仕事です。

あなたが本当に知りたいのであれば...それを試してみてください。さまざまなバージョンを1,000,000回呼び出して、それがどのような違いがあるかを確認します。

オブジェクトの巨大なバージョンを作成し、それが凹みを作成するかどうかを確認します。ウォッチタスクマネージャ。別のブラウザを試してみてください。結果を報告してください。それは、彼らが推測していることがインターネット上でいくつかのジャークを尋ねるだけではなく、見つかるはるかに良い方法です。スペックは、それを必要とする部分的にので、それができないことはできません -

はちょうどソーステキスト

1

まず、状況2で実装して、ページがロードされた直後に1回ロードします。

ページの速度に問題があった場合は、ページ内の特定のタスクにかかる時間を測定します。

オブジェクトを作成するのが非常に高価だった場合(相対的に言えば)、状況3に移行します。

実際にあなたに何も買わないならば、 'if'ステートメントを追加することに意味はありません。この場合、シンプルで大きなオブジェクトを作成することはCPUの背中を汗ばくことではありません。測定がなければ、あなたは最適化されていません。

これは実際に私が個人的にC++やJavaで使ったことを初期化するかなり一般的な方法です。

1

まず、この最適化は実際問題ではありません。

第2に、最後の関数は最初の関数とまったく同じです。よくほとんど。最初に、ガベージコレクタの慈悲のもとにいるとします。domElement.myDataPropertyを再割り当てすると古いオブジェクトが破棄されるはずです。それでも、ガベージコレクタがターゲットプラットフォーム上でどのように動作しているか(ブラウザ間では非常に異なる場合があります)、実際にすべての作業を保存しているかどうかはわかりません。

2

新しいオブジェクトが作成されなければならないよう...に関係なく、とにかくメモリであることをを持つオブジェクトを覚えておいてくださいしかし、代替行動はカウンター直感的になる主な理由は、取る:

function f() { 
    return {a : "b", c: "d"}; 
} 
o=f(); 
alert([o.c, o.e]); // Alerts "b," 
delete o.c; 
o.e="f"; 
o=f(); 
alert([o.c, o.e]); // If the object was only created once this would produce ",f" 

をあなたは本当に、実際にあなたが求めているオブジェクトを生成しないように、新しいオブジェクトの表現を期待していますか?それがあなたが欲しいと思うものですから。

おそらくあなただけやりたい:

あなたが望む効果を得るでしょう
var myFunction = (function(){ 
    var object = {a: "b", c: "d"}; 
    return function() { return object; } 
})(); 

、あなたが戻っているオブジェクトを変更することができ、完全に変更可能なオブジェクトであることを認識する必要があるだろうが、と誰もが同じ突然変異のインスタンスを共有しています。

+0

良い点ですが、ここでは決して変わらない、典型的な機能などのオブジェクトについて話しています。 –

+0

は問題ではありませんが、JSはそれが変更できると言いますが、あなたが変更しようとしていないという事実は無関係です。あなたは 'return [1,2,3];を期待しますか?たとえば、常に同じオブジェクトを返すのですか? – olliej

1

これらの3つすべてをいくつかのブラウザで試して、どちらが高速であるかを確認してください。

関連する問題