5
for(var i = 0; i < 100; i++){
  var foo = 5;

}

それは機能します...しかし、これは悪いですか?

外部で宣言できることはわかってvar fooいますが、ループ内でのみ使用する場合は、なぜそれを行うのでしょうか?

4

2 に答える 2

4

時間が経つにつれて、私の個人的なスタイルは、私が作業している特定の言語の「心」の「実際にある」場所で変数を宣言することを好むようになりました.とにかくそれら。

これは、明快さ、正確なコミュニケーション、理解、保守性のためであり、自分の精神的プロセスを言語のプロセスと平行に保つためです。いくつかの正当な理由を挙げます。

したがって、この特定のケースでvar foo = 5;は、ループの本体に宣言を入れませんfor。単純な理由は、実行しているように見えることを実行していないためです。つまり、実際には変数を再宣言/再スコープしていません。すべての反復で。(var宣言を for ループのヘッダーの初期化部分(初期化; 条件; 後付け)に配置する方が合理的であり、JavaScript がlet-ブロック レベル スコープのスタイル宣言)。

ノート:

  • この慣習は「普通」とは思えないかもしれません。私の心は、変数をその用途に「近い」状態に保つことを好みます。そして、私の現在の慣行は、私の心の働き方に自然には当てはまりません。しかし、何年にもわたるプログラマーとしての混乱、悪いコミュニケーション、誤解、解明不可能な保守不可能なコードなどの経験は、変数に対応する場所で変数を宣言するこのスタイルに従うために必要な余分な規律を正当化する以上のものでした。言語に関係なく、実際のスコープ。

  • このプラクティスのもう 1 つの利点は、関数をモジュール化して適切なサイズに保つことが奨励されることです。

  • 同じように、このプラクティスに従えば、自動的にコードを合理的な方法で整理することができます。たとえば、関数を最初に配置すると、実際に作業しているコードの前に過剰な関数が表示され、その結果、プログラムを編集するために 2 ページ移動しなければならないことにイライラする場合、このスタイルに従うと、自動的に自分のコードを整理するインセンティブが得られます。コードを個別のファイルの適切な構造に変換します。

PS Oneは、一部の関数が非常に長いため、変数宣言が使用されている場所から離れたページになるという点を指摘する可能性があります. はい、私はそれが真実であるコードを見てきました。それでも、コンピューター プログラマーと同様に、散文の作者にも同様に当てはまる類似点を観察せずにはいられません。スキルレベルが上がるにつれて、著者の文章の長さ(およびプログラマーの関数のサイズ)は長くなる傾向があり、スキルレベルがさらに高くなるにつれて、文章の長さ(およびプログラマーの関数のサイズ)は一度短くなる傾向があります。もっと。

于 2013-08-31T02:10:13.350 に答える
3

ifooがローカル変数であるという誤った印象を与えるので、これは悪いことです。

for(var i = 0; i < 100; i++){
    var foo = 5;
}
foo; // 5

これは単純なコードでは問題にならないかもしれませんが、クロージャーを使用すると、 が 1 つしかないことが明らかになりますfoo

var counters = [];
for (var i = 0; i < 100; i++) {
    var foo = 5;
    counters.push(function() { foo++; return foo; });
}
counters[0](); // 6
counters[0](); // 7
counters[1](); // 8 (!)

別のスコープで作成するfooには、関数を導入する必要があります。

var counters = [];
for (var i = 0; i < 100; i++) {
    (function() {
        var foo = 5;
        counters.push(function() { foo++; return foo; });
    })();
}
counters[0](); // 6
counters[0](); // 7
counters[1](); // 6

これが原因で問題が発生する実際の例を次に示します。 for ループの setTimeout が連続した値を出力しない

JavaScript 1.7 以降、letキーワード ( MDNを参照) を使用して真のローカル変数を作成できます。

于 2013-08-31T01:20:28.290 に答える