2010-11-29 11 views
5

メモリ消費量に関しては、これと同等か、後者のすべてのオブジェクトに対して新しい関数インスタンスが得られますか?匿名関数とメモリ消費

var f=function(){alert(this.animal);} 
var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=f; 
    items.push(item); 
} 

var items=[]; 
for(var i=0;i<10;++i) 
{ 
    var item={"animal":"monkey"}; 
    item.alertAnimal=function(){alert(this.animal);}; 
    items.push(item); 
} 

EDIT

私が正しく動作するように閉鎖のためのために、第二のインスタンスが実際に各パスの新しい機能を作成するだろうと考えています。これは正しいです?

答えて

5

第2の方法は、インタープリタがその行を渡すたびに関数を作成するので、第1の方法を試してください。あなたの編集について

:JavaScriptのではなく、ブロックスコープの関数スコープを持っているので、この最適化可能であるかもしれないが、私はそれのすべてを作成しない実装に遭遇していなかったので、私たちは、同じスコープ内のすべての時間です時間。このテクニックを広範囲に使用すると、サポートが不足している実装がメモリリミットを超えてしまう可能性があるため(おそらく可能な)最適化に頼らないことをお勧めします。

1

私はエキスパートではありませんが、さまざまなjavascriptエンジンがこれをさまざまな方法で処理できるようです。

たとえば、V8には隠しクラスと呼ばれるものがあり、同じプロパティにアクセスするとメモリ消費に影響する可能性があります。たぶん誰かがこれを確認したり拒否したりすることができます。