2016-05-08 5 views
0

変数がループ内に作成されるスコープがあるとしましょう。たとえば、ゲームフレームの繰り返し呼び出しで常に実行されるループです。JavaScriptで多くの変数がパフォーマンスに悪いのですか?

for(var i = 0; i !== 10; i ++) { 
    for(var b = 0; b !== 10; b ++); 
} 

可変iもしこのコードの変数はb(ループのブロックが実行されるたびに10回作成された)メモリから削除されていませんか? JavaScriptのガベージコレクタは、ブラウザで同じように機能しません。

何度も作成されたこれらの一時変数がどうなるかを知る必要があります。

答えて

4

var変数は機能スコープです。その宣言は関数の先頭に移動され、一度だけ発生します。これは巻上げと呼ばれます。

次に、あなたのコードは

var i, b; 
// ... 
for(i = 0; i !== 10; i ++) { 
    for(b = 0; b !== 10; b ++); 
} 

のようなものになるだろうそしてもちろん、2つの変数を作成することは問題ではありません。

+0

元のコードで 'var'の代わりに' let'を使用した場合、パフォーマンスは悪くなりますか? – nnnnnn

+0

@nnnnnn本当に悪いとは思いませんが、ループで 'let'や' const'を使うと、繰り返しごとに新しいバインディングが作成されます。 (まあ、少なくともこれは何が起こるべきかです。Firefoxは私が最後にチェックしたことはありませんでした)。したがって、ブラウザがこれを最適化された方法で実装しなかった場合、少し遅くなる可能性があります。 – Oriol

+0

これらの 'i'と' b'はゲームフレームループ関数が呼び出されるたびに作成されますか? (これらのループはゲームループ関数に宣言されていると仮定します)。私はそれについてはわかりませんでした。 –

0

numberタイプの変数は、比較的少ないメモリしか占めません。実際に心配すべきことは、例えば、var foo = new ObjType()で開始する必要がある変数のような、より大きなオブジェクトを繰り返し開始することです。 forループの単純なカウンタ変数を宣言することは、今日のコンピュータでは目立たない。

あなたは最大の最適化については本当に心配している場合は、あなたのような何かを行うことができます:あなたは一度だけ、これらの変数を宣言する方法

var i, b; function onFrame(){ for(i = 0; i !== 10; i++){ for(b = 0; b !== 10; b++){ } } }

を。パフォーマンスの差はごくわずかですが。

+0

小メモ:JSには整数はなく、64ビットの浮動小数点数しかありません。 – Oriol

+0

私は親切なことをしていますが、私はLuaのコンパイラでJSと違うことをしたいのです。問題を避けるために、ユーザープログラムで作成された各変数の変数を作成する必要があります。 –

+0

良い点オリオール。編集されました。 – Marquizzo

関連する問題