web-dev-qa-db-ja.com

JSLintの背後にある「varステートメントが多すぎる」と言っている理由は何ですか

JSLint(onevarフラグがオンになっている)は、以下のJavaScriptコードにフラグを立てています。

5行目の15文字目の問題:varステートメントが多すぎます。

私はこれらのエラーを修正してうれしいですが、知りたいのですが、パフォーマンスのためにそれを行っているのか、それは単なる悪い習慣であり、私のJavaScriptコードにバグを導入する可能性が高いためです。 onevarフラグの背後にある理由は何ですか?

JSLintのドキュメントで var keyword を確認しましたが、同じ関数内の複数のvarステートメントが悪い理由について具体的には触れていません。

ここに例を示します。 varステートメントを1つだけ持つことでコードにどのようなメリットがあるかを説明します。

function Test(arg) {
   var x = arg + 1,
       y = cache.GetItem('xyz');
   if (y !== null) {
      // This is what would cause the warning in JSLint
      var request = ajaxPost(/* Parameters here */);

   }
}
63
slolife

JavaScriptにはブロックスコープがありません。それを使用する他の言語(cなど)では、ifステートメントで変数を宣言した場合、その変数の外部では変数にアクセスできませんが、JavaScriptではアクセスできます。 JSLintの作者は、これは悪い習慣だと信じています。あなた(または他の読者)が混乱して、変数にアクセスできなくなったと思うかもしれませんが、実際にはアクセスできます。したがって、すべての変数を関数の先頭で宣言する必要があります。

98
swampsjohn

公式の理由 ここにあります 、ダグラス・クロックフォードによる。

引用するには:

多くの言語では、ブロックはスコープを導入します。ブロックに導入された変数は、ブロックの外からは見えません。

JavaScriptでは、ブロックはスコープを導入しません。関数スコープのみあります。関数の任意の場所に導入された変数は、関数のすべての場所で表示されます。 JavaScriptのブロックは、使い慣れた構文が誤った約束をするため、経験豊富なプログラマーを混乱させ、エラーを引き起こします。

JSLintは、関数、if、switch、while、for、do、tryステートメントを備え、他の場所を持たないブロックを想定しています。

ブロックスコープの言語では、通常、変数を最初に使用する場所で宣言することをお勧めします。ただし、JavaScriptにはブロックスコープがないため、関数のすべての変数を関数の先頭で宣言する方が賢明です。関数ごとに単一のvarステートメントを使用することをお勧めします。これはvarsオプションで拒否できます。

28
Elzo Valugi

次のように1つの場所で変数を宣言するだけです。

var request,x,y;
6
Roy Walter

関数ごとに1つのvarステートメントのみが許可されている場合に「onevar」オプションがtrueに設定されている場合。

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}
3
tom

推論はすでに説明されています。

このフォームを使用することをお勧めします。

var myVar1 = document.getElementById("myDiv1"),
  myVar2 = document.getElementById("myDiv2");

またはこれ:

var myVar1, myVar2;
myVar1 = document.getElementById("myDiv1");
myVar2 = document.getElementById("myDiv2");

しかし、特に変数をドキュメント化したい場合は、これは見栄えがよくありません。

したがって、この警告を一時的に無効にすることができます:

  /*jslint vars: true*/
  /**
   * @returns {HTMLDivElement}
   */
  var myVar1 = document.getElementById("myDiv1");
  /**
   * @returns {HTMLDivElement}
   */
  var myVar2 = document.getElementById("myDiv2");
  /*jslint vars: false*/

警告:これが関数の上部で行われることを確認してください。

これは、変数が関数の最上部で宣言されているかどうかをjslintが確実に判断できなかったために行われたと思います。

2
Vanuan

ここでは推測ですが、 関数分解 の時間になるかもしれません。関数はoneを実行し、うまく実行する必要があります。

Varが多すぎると、あまりに多くのことをしようとしている関数を示唆しています。または、配列を使用する必要がある場合。

1
tpdi