16

最近、jQuery と JavaScript をそのまま使用して JS コードを書いていて、JSLint を試してみようと思いました。コードにはさまざまな関数と jQuery の使用法が含まれており、IE8 と最新の Firefox で (エラーなしで) 正常に動作するとしましょう。このコードは、XHTML 1.0 Transitional としても検証されます (Strict も同様ですが、主に Transitional として有効にしたいと考えています)。

ただし、JSLint を使用すると、すべてが間違っているように見えます。非常に厳格であると読んだことがありますが、「The Good Parts」だけをオンにしても、通常の HTML ページでは 70 以上のエラーが発生します。

それはこれから始まります (なぜ世界で、ドキュメントの XHTML を無効にするためにタイプを削除したいのですか??)

Problem at line 5 character 67: type is unnecessary.

<script src="/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>

次のような難解なエラーが続きます

Problem at line 41 character 41: Use the array literal notation [].

var rows = new Array();

Problem at line 42 character 30: Too many var statements.

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

Problem at line 42 character 55: Unexpected use of '++'.

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

Problem at line 64 character 50: ['PrettyId'] is better written in dot notation.

var item = $("#item_" + data["PrettyId"]);

これらのエラーに対する回答、特に JSLint に jQuery を認識させて理解させる方法を誰かが教えてくれれば、感謝します。

そうでない場合は、使用するかどうか、使用するようにアドバイスするかどうかを説明してください。

アップデート:

他の回答がある場合は、もう 1 日待ちます。その後、賛成票が最も多い回答を受け入れます。

4

7 に答える 7

26

JSLint を使用する際に覚えておくべきことは、ある人が「良い部分」と考えるものについての意見に基づいて構築されているということです。

は素晴らしいツールだと思いますが、同意できないルールがあります。

属性については、ここtypeで著者の意見について詳しく知ることができます。彼は、属性は「必要であり、必要ではない」と述べていますが、ドキュメントを検証すると、明らかに必要です。

Array リテラル表記[]と Array コンストラクターを使用すると、次のように、2 つの構文の動作が異なる可能性がある違いがあることに同意します。

 [5]; // one-element array
 ["5"]; // one-element array

 new Array(5); // empty array but its length is initialized with 5
 new Array("5"); // one-element array

したがって、一貫性と簡潔さのために、リテラル表記の方が優れています。

「あまりにも多くの var ステートメント」について、JavaScript にはブロック スコープがなく、スコープは関数レベルまたはグローバル レベルであり、すべてのvarステートメントはコードの実行前に評価されますundefined。ランタイム。

例えば:

var x = 0;
if (true) {
  var x = 1; // useless var, x already declared
}
x; // 1

変数宣言の「巻き上げ」は、次の例で示すことができます。

var x = 5;  // global
(function () {
  alert(x); // alerts `undefined`, x declared but unassigned in this scope
  alert(y); // ReferenceError, y is undeclared

  var x = 10;
})();

実際のコード実行の前に宣言されているため、x保持されていることがわかるように、ステートメントはそれらを囲むスコープの先頭に引き上げられます。undefinedvar

var x = 5;  // global
(function () {
  var x;
  alert(x); // alerts `undefined`, x declared but unassigned
  alert(y); // ReferenceError, y is undeclared

  x = 10; // assignment is made
})();

varそのため、そのルールは実際にコードを作成して、最初にすべてのステートメントが発生するようにしたいと考えています。

「'++' の予期しない使用」については、これもまた私があまり好きではないルールであり、著者は「それらは過度のトリッキーさを助長することによって悪いコードに寄与する」と考えています。

式でそれらを使用する場合、演算子の使用法を単独のステートメントに抽出しようとします。次に例を示します。

array[++id] = x;

に:

id+=1;
array[id] = x;

どちらがより明確ですが、とにかくforステートメントIMOの場合、混乱を引き起こすことはまったくありません...

最後の「['PrettyId']はドット表記で書いたほうがいい」について。、JSLintはブラケット表記の使用が「動的」であることを期待しています。有効な識別子名を含む文字列リテラルではなく、そこに式があることを期待しています。ブラケット表記は、プロパティにアクセスする場合にのみ使用する必要があります。予約語と衝突する名前 例:

data.function;    // SyntaxError in ECMAScript 3 based implementations
data["function"]; // Ok

または、プロパティに有効な識別子ではない文字が含まれている場合、たとえば次のようになります。

data.foo-bar;    // it access the property `foo` minus a `bar` variable
data["foo-bar"]; // Ok

data.foo bar;    // SyntaxError, unexpected `bar` identifier
data["foo bar"]; // Ok
于 2010-09-19T14:56:08.197 に答える
6

私は .js ファイルで jslint を使用し、それを満足させるオプションと修正の組み合わせを見つけます。コードの品質が向上することがわかりました。省略された「var」宣言を分離するためにのみ使用する場合でも、実行することをお勧めします。

HTMLファイルに対して実行しないことで、スクリプトタグの警告を回避します。私は .js ファイルでは体系的に jslint を使用していますが、html では使用していません。インクルードされたスクリプトで定義されたすべてのグローバル識別子を宣言するのは面倒すぎると思いますが、jslint には表示されません。

Crockford の著書「Javascript: The Good Parts」では、jslint の警告のすべてではないにしても多くが説明されており、そのうちのいくつかは、認識されているバグの傾向に基づいています。「new Array()」と「[]」の警告は、「new」演算子に対する Doug の嫌悪感に基づいています。さまざまなコンストラクターで「new」を省略することは、一般的に有効なコードですが、正しいコードではありません。代替構文を使用すると、そのリスクを回避できます。

'too many vars' エラーは、特定の関数に多数の 'var' 宣言があることを意味します。Crockford が推奨するスタイルは、すべて関数の先頭で 1 つまたは非常に少数の 'var' 宣言を使用することです。複数の変数をカンマで区切って、1 つの var ステートメントで宣言できます。

「++」の注意は、バグの発生しやすさに基づく別の警告です。「+=1」を使用しても同じことを意味し、Doug はその方がエラーが発生しにくいと考えています。

したがって、jslint は混合バッグです。一部の機能 (ローカルとグローバル) は非常に価値があり、一部 (スクリプトの種類) は単に煩わしいだけであり、多くは疑わしい利点がありますが無害です。

ここで説明されているように、jQuery 自体は jslint チェックに合格します: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint

于 2010-09-19T15:37:49.643 に答える
5

タバコを吸うプログラマーについての古いジョークがあります。ある友人は、「あなたは本当に頭のいい男だ。たばこはあなたを殺すと書いてあるパッケージの警告を読めないの?」と言いました。「私はプログラマーです。エラーだけに注意を払い、警告には注意を払っていません。」

JSLint は重要なことを教えてくれることもあれば、しつこいことを教えてくれることもあります。あなたはそれを幸せにしようとして迷ってしまうかもしれませんが、それがなければただ迷ってしまうかもしれませ. 他のツールと同様に、その入力は一粒の塩で受け取る必要があります。私はそれを MS Word のスペルチェッカーや文法チェッカーのように考えています。正しい場合もあれば、間違っている場合もあり、何を言われても気にしないこともあります。

于 2010-09-19T14:54:22.243 に答える
1

JSLint はコード品質ツールです。W3C バリデータとは異なります。企業での毎週のコード レビューのようなものと考えてください。コーディング規約はさまざまであり、JSLint はその 1 つにすぎません。同意できない点があるかもしれませんが、チームで作業していて、より大きなコードベースを管理する必要がある場合、JSLint は命の恩人になる可能性があります。なんで?紛らわしいことやエラーが発生しやすいことについて警告するからです。

JSLint を使用する最良の方法は次のとおりです。すべての説明を読み、正しいことがわからない場合は、提案されているとおりに実行してください (ここではそうであるように思われます)。

その理由は、JSLint は混乱を避けるためのものであり、エラーにつながる可能性のあるものを使用していて、その理由がわからない場合は、明確な代替手段を使用することをお勧めします。

提案の背後にある理由を知りたい場合は、Javascript に関する Douglas Crockford のビデオをご覧ください。

最後に、不要なフィルターをオフにすることができます。

于 2010-09-19T17:04:52.363 に答える
1

古いコードで使い始めると痛いです。

しかし、それはあなたに多くの時間を節約します。
JSLint は、ページを更新したときにのみ表示される問題や、ユーザーがページを更新したときにさらに悪化する多くの問題を検出できます。
JSLintなしでエディターを使用しなければならないとき、今は私を傷つけます

もう 1 つの利点は、JavaScript の圧縮を開始する場合です。JSLint チェックに合格すると、問題なく圧縮できることがほぼ確実になります。

そうは言っても、jquery には 23 個の警告があり、そのほとんどは正規表現に関するものですが、問題なく広く使用されています。

于 2010-09-19T17:07:58.587 に答える
0

あなたはそれを使うべきです。1 つのブラウザーで機能するという事実は、すべてのブラウザーで機能するという意味ではありません。あるものは他のものより寛大です。たとえば、配列の末尾にカンマがあると、IE では機能しなくなりますが、FF では機能します。

コードのコンパイルのように、大量のエラーが発生することがありますが、最初のエラーを削除すると、多数のエラーがなくなることに注意してください。

できるよ

var rows = [];

最初のエラー。

于 2010-09-19T14:50:39.677 に答える
0

これが私ができる最善の答えです。おそらく誰かがいくつかの空白を埋めることができます. ただし、これらのいずれも jQuery に関連しているようには見えません。

また、いくつかの説明については、このドキュメントを参照してください。

Problem at line 5 character 67: type is unnecessary.

<script src="/Scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
and goes on with esoteric errors like

最新のブラウザーでは、text/javascript外部の js ファイルにリンクする必要はないと思います。


Problem at line 41 character 41: Use the array literal notation [].

var rows = new Array();

オブジェクトまたは配列を作成するときは、コンストラクターを呼び出さないことをお勧めします。正直なところ、理由はわかりません。誰?


Problem at line 42 character 30: Too many var statements.

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

i同じスコープ内の別の場所で変数が宣言されていると思います。JavaScript ブロックはスコープを作成しないため、 を使用する別のforループ (たとえば) があるi場合、同じ変数を使用しています。再度宣言する必要はありません。


Problem at line 42 character 55: Unexpected use of '++'.

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

これについてはよくわかりませんが、私の記憶が正しければ、Crockford は and が好きでは++ありません--


Problem at line 64 character 50: ['PrettyId'] is better written in dot notation.

var item = $("#item_" + data["PrettyId"]);

.記法の方が短くて速いため、記法が好まれると思います(とにかく一部のブラウザでは)。代わりdata.PrettyIDに。

私が知る限り、明らかに間違っていると思われるものは何もありません。ほとんどの場合、JSLint 作成者の観点からのベスト プラクティスのアドバイスです。

于 2010-09-19T14:55:05.063 に答える