77

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

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

アップデート

例:

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/よりもはるかに良く見えます

4

7 に答える 7

151

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

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


関数の先頭にあるvar i;から置く方法はありません。for(var i=0; ...; i++)特にJavaScript仕様forがセクション(12.6)で受け入れ可能な構文としてそれを持っている場合。また、これはブレンダン・アイクが彼の例で使用している構文です。

宣言を一番上に移動するという考え方は、内部で起こったことをより正確に反映することになっていますが、そうすることは影響を与えるのではなく、反映するだけです。

for私にとって、これは反復に対するばかげた期待です。JSLintは、それを検出すると処理を停止するため、さらにそうです。

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

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

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

于 2011-06-20T13:12:31.843 に答える
7

Google Closureコンパイラは、for(var i in ...)のように宣言されていない限り、for ... inループのループ変数のタイプを実際に正しく検出できず、アノテーションがこれを修正していないように見えるため、宣言を移動できません。頂点に。

于 2012-06-30T15:18:49.047 に答える
5

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

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

于 2011-02-01T23:11:30.113 に答える
4

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

于 2011-02-01T21:46:11.483 に答える
3

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

于 2011-08-29T10:22:54.790 に答える
1

新しいベータJSLintは、関数内の複数の許容範囲に関するコメントディレクティブを文書化していません元のバージョンのディレクティブをサポートしているように見えます。var

オリジナルのJSLintでは、これを行うことができました。

/*jslint vars: true */

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

于 2015-06-09T23:02:29.123 に答える
0

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

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
}
于 2016-04-29T03:15:03.440 に答える