3

私はガベージコレクションについてあまり考えたことはなく、小さなjavascriptゲーム/アプリケーションを作成するときに考慮する必要があるかどうかもわかりません。アドバイスをいただければ幸いですが、最後に具体的な質問をさせていただきます。

多くの場合、私はこの形式のコードを記述します。

var foos=new Array();
generateFoos();
function generateFoos()
{
    foos=[];
    for (fooIndex=0;fooIndex<numberOfFoos;fooIndex++)
    {
        foos[fooIndex]=new foo(Math.random(),Math.random());
    }
} 
function foo(bar,bas)
{
   this.bar=bar;
   this.bas=bas;
}

だから私の質問は、私が言うときfoos=[](5行目)、これはその配列内のオブジェクトをメモリから削除しますか、それともどこかに浮かんで、プログラムを大きくして遅くしますか?generateFoos()ユーザーがキーを押すたびに、何度も電話をかけたい場合はどうすればよいですか。

ありがとう!

4

2 に答える 2

8

特定の答えについては、受け入れられたものは実際には質問に直接答えないので、そうです、foo=[]は配列内の以前の値を逆参照します。

Alesが言うように、「オブジェクトが到達不能になると、ガベージコレクションの対象になります」。確かに、これはブラウザがメモリからそのようなものをクリアするときです。

重要な点は、削除はガベージコレクションを行わないことです

あなたはこれを何度も何度も見ます、そしてこの質問へのコメントでさえ。deleteキーワードは、オブジェクトからプロパティを削除し、ガベージコレクションとは関係ありません。

また、コード自体についてもアドバイスを提供したいと思います。

1)基本的なデータ型には、新規ではなくリテラルを使用します

2)関数を宣言する前に関数を呼び出さないでください。はい、動作しますが、面倒で後で読むのが難しくなります。コードを書くよりも読むことに多くの時間を費やすことを忘れないでください。後で簡単にフォローできるようにします。

3)関数スコープを覚えておいてください。varなしで宣言された変数はすべてグローバルになります。varを使用すると、それを含む関数のスコープ内にとどまります。関数内で変数のスコープを設定するもう1つの方法は、名前付きパラメーターとして渡される場合です。

4)関数を作成するときに関数にvarを使用します。コードでは、関数はグローバルです。

5)間隔を使用します。テキストの密度は敬虔さの隣ではありません。あなたは今20代の視力を持っているかもしれませんが、ほんの数年で空白に感謝するでしょう。

6)varを使用してforループでカウンターを宣言します。それらをグローバルにしたい場合を除きます。そして、あなたはほとんど決してそうしません。

今すぐコードを作り直しましょう:

var numberOfFoos = 10,
    foos = [];

var generateFoos = function(){

    foos = [];

    for( var fooIndex = 0; fooIndex < numberOfFoos; fooIndex++ ){

        foos[ fooIndex ] = new foo( Math.random(), Math.random() );

    }

},

foo = function( bar, bas ){

   this.bar = bar;
   this.bas = bas;

}

generateFoos();
console.log( foos );
于 2013-01-09T02:11:42.623 に答える
6

質問に答えるには:オブジェクトが到達不能になると、ガベージコレクションの対象になります。プログラムがその配列内のオブジェクトへの他の参照を保持していない場合、それらはガベージコレクションされます。

実際のガベージコレクションのタイミングは、多くの側面と選択したガベージコレクションアルゴリズムによって異なりますが、コードを作成するときに心配する必要はありません。

ガベージコレクションを検討する際の最善のアドバイスは、ガベージコレクターに任せて仕事をすることです。指示したり、助けたりしないでください(たとえば、参照を手動で無効にするなど)。コードの問題と機能面に焦点を当てます。

于 2013-01-09T01:32:16.147 に答える