28
function test(){
    if(true){
        var a = 5;
    }
    alert(a);
}

test();

JsLintでチェックすると、JSコードで「範囲外」エラーが発生し続けますが、これは意味がありません。そのため、すぐに例を作成しました。とにかく、変数が最終的に関数の先頭に引き上げられるため、このコード部分に実際に何か問題がありますか?

4

3 に答える 3

34

変数をvar関数にローカライズし、巻き上げの対象となりますが、ほとんどの言語には関数スコープではなくブロック スコープがあります。

if ブロック内で var キーワードを使用し、そのブロック外の変数にアクセスすることで、その JS の特異性に慣れていない人を混乱させる可能性のある構造を作成しました。

Douglas Crockfordは、関数の先頭に単一のvarステートメントを使用して、その関数にスコープを設定する必要があるすべての変数を指定することを推奨しています。

function test(){
    var a;
    if(true){
        a = 5;
    }
    alert(a);
}

test();

複数の変数を使用すると、次のようになります。

function foo () {
    var a, b, c, d = "only d has an initial value", e;
    // …
}
于 2010-03-20T23:19:33.377 に答える
5

あなたが書いたコードは機能しています。読みやすさ/保守性があまり高くありません。aのスコープ内で変数を宣言すると、このスコープ内でのみ表示さifれる誤った印象を与える可能性があります (このプログラムが示すように、これは正しくありません。関数全体で表示されます)。aa

この JsLint 警告は、次のように、変数が実際に使用される正確なスコープに宣言を配置することをお勧めします。

function test(){
  var a;
  if(true){
      a = 5;
  }
  alert(a);
}
于 2010-03-20T23:21:49.237 に答える