web-dev-qa-db-ja.com

JsLint 'スコープ外'エラー

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

test();

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

28
Rajat

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;
    // …
}
34
Quentin

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

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

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

Javascriptには関数スコープがあり、ブロックスコープはありません。したがって、if関数の内部で宣言された変数は、ifブロックの外部で、ifステートメントが宣言されている関数内で表示およびアクセスできます。

JSLintやjsbinなどのオンラインコンパイラは警告を出しますが、エラーではありません。

1
kumarras