63

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

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

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

私はvar キーワードの JSLint ドキュメントを見ましたが、同じ関数内の複数の 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 */);

   }
}
4

7 に答える 7

98

Javascript にはブロック スコープがありません。他の言語(cなど)では、if文で変数を宣言すると、その外側ではアクセスできませんが、javascriptではアクセスできます。JSLint の作成者は、あなた (または他の読者) が混乱して、変数にアクセスできなくなったと思うかもしれませんが、実際にはアクセスできるため、これは悪い習慣だと考えています。したがって、関数の先頭ですべての変数を宣言する必要があります。

于 2009-05-01T06:03:51.640 に答える
28

公式の理由、ダグラス・クロックフォードによるものです。

引用するには:

多くの言語では、ブロックによってスコープが導入されます。ブロックに導入された変数は、ブロックの外側には表示されません。

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

JSLintは、関数、if、switch、while、for、do、およびtryステートメントを備えたブロックを想定しています。

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

于 2009-11-19T15:35:51.177 に答える
6

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

var request,x,y;
于 2009-11-05T15:41:17.310 に答える
3

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

if (funct['(onevar)'] && option.onevar) {
    warning("Too many var statements.");
}
于 2009-05-01T05:50:14.030 に答える
2

理由はすでに説明されています。

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

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が確実に判断できなかったためだと思います。

于 2012-10-13T23:08:51.463 に答える
1

ここは推測ですが、機能分解の時期かもしれません。関数は1 つのことを適切に行う必要があります。

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

于 2009-05-01T05:48:34.003 に答える
-6

アイデアは、個々の変数の代わりにオブジェクトを使用する必要があるということです。だからあなたが持っている場所:

var x = arg + 1,
    y = cache.GetItem('xyz');

次のように変更します。

var dimensions = {};
dimensions.x = arg + 1;
dimensons.y = cache.GetItem('xyz');
dimensions.request = ...

次に、オブジェクトを介してこれらの変数にアクセスできます。その関数変数を含む関数ごとに 1 つのオブジェクトを用意する方が適切です。その後、警告は表示されません。

于 2009-09-20T22:26:34.087 に答える