2011-11-09 6 views
3

大きなFORループ内の新しいローカル変数は、これが問題ですか?この単純な例機能で

doSomething = function(withThisId) { 
    var videos  = getVideos(), // array of videos 
     discovered = false 
    ; 

    for(var i = 0; i < 50000; i++) { 
    var keepToCheck = videos[i]; 

    if(keepToCheck.id == withThisId) { 
     discovered = true; 
     break; 
    } 
    } 

    return discovered; 
}; 
私があれば知りたいのですが

  1. forループ内で、我々は反復し、その後のためにそれを使用するたびにkeepToCheckと呼ばれる新しい変数を初期化します何か。これは、毎回新しい変数が作成されることを意味しますか?そのため、GCがクリアするまで、メモリに50,000の変数が存在する可能性がありますか?

    または、JSエンジンは、変数を再利用し、複製を作成することができないことを知っているのに十分スマートですか?

  2. var keepToCheckforループの外側に設定してから、それをkeepToCheck = videos[i];と設定するとパフォーマンスが向上しますか?

私はこれを調べようとしてきましたが、ネット上で何か示唆を見つけることはできませんでした。

答えて

0

は、JSについて多くを知らないが、ガベージコレクションと他の言語では、ローカル変数は、ガベージコレクションの対象にはなりません - スコープが残された後、彼らはなくなっているので、彼らは、スタック上に住んでいます。したがって、これらの変数は同時に複数存在することはできません。ただし、繰り返しごとに異なるアドレスになる可能性があります。

+0

JSガベージコレクションはブラウザに依存しているため、コールスタック中に実行される可能性があります。実際に伝える方法はありません。 – AutoSponge

1

JavaScriptでは、1つの変数のみが作成されます。最初の反復の後には、keepToCheckが既に存在し、上書きされ、新たに作成されることはありません。

しかし組織化の目的で、すべての変数を必要とするとすぐにリストすることをお勧めします。この場合、私は次のようになります。

var videos = getVideos(), 
    discovered = false, 
    keepToCheck, i; 

コードの残りの部分が続きます。一部の変数がifの内部でのみ使用されている場合、そのブロックの最初のものがI varになります。

+0

これはfalseです。別の変数が作成され、前の変数がガベージコレクションに送信されます。 – AutoSponge

1

変数は、それらが宣言され、上書きされた場合にごみが(完全にスケジュールするためのVM /ブラウザまで)収集します関数の先頭に「掲揚」されています。反復的なvarステートメント(ループなど)はちょうど無駄です。メモリには50kの変数はありませんが、ガベージコレクションの実行に応じて処理時間とメモリが無駄になります。そのため、関数の最上位にvarsを宣言することが最善です。このコードでJSLint/JShintを実行して、私の言いたいことを見てください。

関連する問題