2013-08-31 14 views
5
for(var i = 0; i < 100; i++){ 
    var foo = 5; 

} 

これは機能しますが、これは悪いですか?変数を複数回宣言する

私はvar fooを外側に宣言できることを知っていますが、なぜ私はループ内でのみ使用するのですか?

+11

実際、一度だけ宣言されています。すべての変数宣言は、スコープの先頭(関数の先頭またはグローバルスコープ)に持ち上げられます。ブロックはJavaScriptでスコープを作成しません。 – bfavaretto

+0

@bfavaretto:少なくともまだない。 – elclanrs

+0

セマンティクスはbfavarettoとして記述されていますが、私はuse siteに "宣言を閉じたままにする"ことを好みます。これはコードの振る舞いを変えることはありませんが、*コードの意図をより明確にして、コードをスキャンして何か疑わしい場所に見えるかどうかを調べることができます。他の人はそれに同意しないかもしれません。 – user2246674

答えて

3

私の個人的なスタイルは、私が取り組んでいる特定の言語の「心」にある変数を宣言するための環境設定に成長しました。JavaScriptでは、変数と関数の宣言を言語はとにかくそれらを持ち上げるでしょう。

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

var foo = 5;宣言をforループの本体に入れないという単純な理由から、実際には再宣言されていないという単純な理由から/繰り返しごとに変数を再スコープする。 (varの宣言をforループのヘッダ(初期化;条件;補足)の初期化部分に配置する方が、より合理的であり、JavaScriptなどのブロックレベルの変数を持つ言語ブロックレベルのスコープのletスタイル宣言を採用終了)

注意:

  • この方法は、「正常」思わないかもしれません私の心は、変数を自分の使用に "近づける"ことを好むし、私の現在の慣行は自然に私の心が働く方法には及ばない。しかし、何年ものプログラマーとして、混乱、悪いコミュニケーション、誤解、解読不可能なコードなどの経験は、このスタイルの変数を宣言するのに必要な余分な規律を言語に関係なく実際の範囲。

  • 私にとってこのプラクティスのもう一つの利点は、私の機能をモジュール化して妥当なものにすることを奨励することです。

  • この練習に従うと、自動的にコードを整理しておくのに役立ちます。たとえば、自分の関数を最初に置くと、実際に作業しているコードの前に関数が過剰になるため、プログラムを編集するために2ページをダウンする必要があり、このスタイルに従うと、自動的に異なるファイルの適切な構造にコード化します。

P.いくつかの関数が長すぎるために、変数の宣言が使用されている場所から離れたページになることがあります。はい、私はそれが本当であるところのコードを見てきました、そしておそらくそれが助けられないところでコードすることさえあります。しかし、それはコンピュータプログラマのためのものと同じように、散文の著者にも同様に当てはまることを助けることはできません。スキルレベルが上がるにつれて、著者の文章の長さ(およびプログラマーの機能のサイズ)は増加する傾向にあり、スキルレベルがさらに高まるにつれて、文章の長さ(およびプログラマーの機能のサイズ)は一度短くなる傾向がありますもっと。

+0

メソッドを細くしておくことを忘れないでください。しかし、私はまた、たとえ彼らが吊り上げられたとしても、それらが使用されている変数を宣言することを好む。 –

3

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

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

これは単純なコードの問題ではないかもしれませんが、あなたはクロージャを使用する場合には、一つだけ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 

が原因これに間違って物事の実際の例である:setTimeout in for-loop does not print consecutive values

JavaScript 1.7以降では、真のローカル変数を作成するのにというキーワード(MDNを参照)を使用することができます。

関連する問題