web-dev-qa-db-ja.com

JSLintエラー:すべての 'var'宣言を関数の先頭に移動します

JSLintサイトが更新され、JSスクリプトをチェックできなくなりました。私にとって、この警告は重要ではなく、これを修正するために何千行も行きたくありません。もっと重大な問題を見つけたいです。

誰もこのエラーをオフにする方法を知っていますか、レガシーJSLintを使用しますか?

[〜#〜] update [〜#〜]

例:

function doSomethingWithNodes(nodes){
  this.doSomething();

  for (var i = 0; i < nodes.length; ++i){
    this.doSomethingElse(nodes[i]);
  }

  doSomething(); // want to find this problem
}

jslint.comの出力:

Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.

for (var i = 0; i < nodes.length; ++i){

Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).

問題:

関数の上に変数を持つことは新しい要件です。このエラーでスクリプトのスキャンを停止するため、JSLINTを使用してコードをテストすることはできません。

私はたくさんのコードを持っていますが、この警告を重大なエラーとして脅したくありません。

更新日2011年8月22日:発見 http://jshint.com 、それは http://jslint.com/ よりもずっと良く見えます

77

2017年6月更新:サポートの対象(たとえば、Internet Explorer 10以下でJavaScriptを実行していない場合)、使用を検討する必要があります- letvar の代わりに。

例:for(let i=0; ...; i++)


関数の一番上にあるfor(var i=0; ...; i++)からvar i;を配置する方法はありません。特に The JavaScript Specificationforセクション(12.6)で受け入れられる構文として使用している場合。また、彼の例で使用されている構文 Brendan Eich です。

宣言を一番上に移動するという考えは、ボンネットの下で起こることをより正確に反映することになっていますが、そうすることは反映するだけで、影響はありません。

私にとって、これはforの繰り返しに対するとんでもない期待です。 JSLintは、それを検出すると処理を停止するためです。

関数の先頭で変数を宣言する方が読みやすいかどうかは議論の余地があります。個人的には、イテレータ変数を使用するときに宣言することを好みます。変数が既に内部で作成されているかどうかは気にしません。ここで初期化するので安全です。

イテレータ変数を使用する場所で宣言することで、それらが誤ってグローバルにならないようにします(ループを別の関数に移動すると、イテレータ変数も一緒に移動します)。これは、関数の先頭で変数宣言を維持するよりもはるかに維持しやすいです。

今のところ、私は http://www.javascriptlint.com/online_lint.php を使用しています。なぜなら、重要なことに焦点を当てているようだからです。

151
Lee Kowalkowski

Google Closureコンパイラは、for(var i in ...)のように宣言されていない限り、for ... inループのループ変数の型を正しく検出できず、これを修正する注釈はないため、宣言を移動することはできません頂点に。

7
jjrv

レガシーバージョン をいつでもダウンロードするか、 最新バージョン を変更できます。それほど難しいことではありません(move_varを検索してください)。次に、ノードを使用するか、単純なHTMLフォームを備えたブラウザを使用して、jslintをローカルで実行します。Crockfordのオリジナルをコピーすることをお勧めします。

警告は major rewrite の一部として導入されており、for(の後にのみ発生するため、メッセージは少し誤解を招く可能性があることに注意してください。

5

すべての変数を先頭に移動することは、「関数ごとに1つのvarステートメントを許可する」とは異なることに注意してください。すべての変数を一番上に移動するという要件は新しく、スイッチがないようです。詳細は http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e

4
Paul Beusterien

JSLINTの最新バージョンに切り替えたいときに、コードベースでこの問題が発生しました。私たちはそれらの多くを持っていて、人々は宣言を動かすことに満足していませんでした。実際に最もエレガントなソリューションは、アンダースコア.jsを使用し、完全な冗長ループを使用する代わりに、_。each()関数を使用することであり、これによりJSLintエラーが削除され、コードがより機能的、クリーン、タイト、簡単になりました読む。

newbeta JSLint は、関数内の複数のvarトレランスに対するコメントディレクティブを文書化していませんが、itdoesは、元のバージョンのディレクティブをサポートしているように見えます。

元の JSLint では、これを行うことができました。

/*jslint vars: true */

私の経験では、これはまだ機能します。後方互換性があると思います。この記事の執筆時点は2015年6月です。

1
Peter

次の構文でエラーが削除されることがわかりました。

function doSomethingWithNodes(nodes) {
    this.doSomething();
    var i; // HERE is where you move the 'var' to the top of the function
    for (i = 0; i < nodes.length; ++i) {
        this.doSomethingElse(nodes[i]);
    }

    doSomething(); // want to find this problem
}
0
Gio