1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの変数宣言はループの外か中か?

2022-04-18 14:59:38

質問

AS3では、パフォーマンスを上げるために、ループの外側ですべての変数を初期化する必要があると思います。これはJavaScriptでも同じでしょうか?どちらがより良い/より速く/ベストプラクティスですか?

var value = 0;

for (var i = 0; i < 100; i++)
{
    value = somearray[i];
}

または

for (var i = 0 ; i < 100; i++)
{
    var value = somearray[i];
}

解決方法は?

あるんです。 全く違う JavaScriptでもActionScriptでも、意味や性能は同じです。

var はパーサに対する指示文であり ではなく ランタイムに実行されるコマンドです。もし、特定の識別子が var 関数本体(*)のどこかで1回以上その識別子を使用した場合、ブロック内でその識別子を使用した場合は、すべてそのローカル変数を参照することになります。このとき value と宣言されています。 var ループの内側、外側、またはその両方。

結果的に、読みやすいほうを書けばいいんです。私は、関数の先頭にすべてのバーを置くことが常にベストであるというCrockfordの意見に反対です。コードの一部で一時的に変数を使用するような場合は、次のように宣言するのがよいでしょう。 var そのセクションは独立していて、コピーペーストが可能です。そうでなければ、リファクタリング中に新しい関数に数行のコードをコピーペーストして、別途関連する var そして、偶発的なグローバルが発生します。

特に

for (var i; i<100; i++)
    do something;

for (var i; i<100; i++)
    do something else;

Crockfordは、2番目の var (または、両方の var を実行し var i; を参照)、jslintはこのことであなたに泣きつくでしょう。しかし、IMOでは、両方の var のように、関数の先頭に忘れやすいコードを追加するのではなく、関連するコードをすべて一緒にしておくのです。

個人的には var というのは、独立したコードのセクションで最初に変数を代入するとき、同じ関数の他の部分で同じ変数名が別に使われているかどうかに関係なく、その変数が使われるからです。私にとっては var ANSI Cの古いリビジョンの制限をJavaScriptにも適用することは、私の義務とは考えていないのです。

(*: ネストした関数本体以外)