JSLint改造版

(実行例とダウンロードは ↓ 下の方 ↓ にあります)


1.概要

JavaScript 用の文法等のチェッカーである JSLint を一部改造したものです。


古いタイプの html を入力した場合に、JavaScript 部分のみを取り出してチェックを行う

ようにしました。また、エラー検出時になるべく解析を停止せずに続行するようにしました。


オリジナルは Douglas Crockford 氏が作成した jslint.js 2016-06-19 版 です。

オリジナルについては、以下のサイトを参照ください。

実行サイト http://JSLint.com/

説明(英語) http://jslint.com/help.html

ソース https://github.com/douglascrockford/JSLint


2.使い方

jslint_modified.html, jslint_modified.js, report_modified.js を 同一フォルダにおいて、

jslint_modified.html を ブラウザで開くと起動します。


src のテキストボックスに JavaScript か JavaScript を含んだ html の内容をコピーして、

check ボタンをクリックすると、JavaScript の文法等のチェックを行い、結果を表示します。


結果の内容は、以下の6項目になります。

(1)エラー (errors)

(2)未宣言変数 (undeclared)

(3)未使用変数 (unused)

(4)スコープ外参照 (out of scope)

(5)関数一覧 (functions)

(6)プロパティ一覧 (properties)


また、clear ボタンをクリックすると、テキストボックスおよび結果をすべてクリアします。


また、「sort errors by line no.」のチェックボックスにチェックを入れると、

結果の エラー(errors) を、行番号順にソートして表示します。

チェックを入れなければ、ソートせずに検出順で表示します。

(解析が途中で停止する場合には、エラーをソートせずに表示すれば、

最後に表示されるエラーが 停止の原因であると分かります)


また、sample1 ボタンをクリックすると、テキストボックスにサンプルを表示します。


また、cut html ボタンをクリックすると、テキストボックスの内容から JavaScript 以外の部分を

削除します。(デバッグ用です)


3.オプション設定

オプションのチェックボックスでは、チェック時に無視する項目等を設定します。

以下の項目が存在します。

bitwise ビット演算子 (& | ^ ~ << >> >>>) の使用を許可します。

browser ブラウザのシンボル (document等) を宣言済みにします。

couch Couch DB 用のシンボル (emit等) を宣言済みにします。

devel 開発用のシンボル (alert等) を宣言済みにします。

es6 ECMAScript6 の記述を許可します (アロー関数等)。

eval eval の使用を許可します。

for for 文の使用を許可します。

fudge 行番号と桁数を0からではなく1からカウントします。

multivar ひとつの宣言文 (var/let/const) で、複数の変数の宣言を許可します。

node Node.js のシンボル (process等) を宣言済みにします。

single シングルクォートで囲んだ文字列を許可します。

this this の使用を許可します。

white 空白のルールを無視します。

-- 以下は改造で追加した項目になります --

continue continue 文の使用を許可します。

eqeq == と != の使用を許可します。

newcap コンストラクタ (new Xxx()) の名前が大文字で始まっていなくても許します。

plusplus ++ と -- の使用を許可します。

sloppy 各関数の先頭に ECMAScript5 の厳格モード ( "use strict"; ) の宣言が

なくても許します。

window シンボル window を宣言済みにします。

numkey 連想配列オブジェクトのハッシュキーに数値の指定を許可します。

(ただし、実際には文字列に変換して使用されるので注意)

undecl 未宣言変数のエラーメッセージの表示を抑制します。

unused 未使用変数のエラーメッセージの表示を抑制します。

scope スコープ外参照のエラーメッセージの表示を抑制します。

loop ループ構造に関するチェックを行いません。

cond if/while/do の条件式に関するチェックを行いません。

shadow 外部のスコープの変数を隠すような宣言を許可します。


また、オプションのテキストボックスでは、チェック時のパラメータ等を設定します。

以下の項目が存在します。

maxerr 検出する最大エラー数を指定します

(undecl,unused,scope で表示を抑制した件数も、カウントして判定されます)

maxlen 許容する1行の最大文字数を指定します。

global 宣言済みのシンボルを空白で区切って指定します。


4.オリジナルからの変更点

オリジナルの JSLint からの変更点を以下に示します。

(1)html の JavaScript 以外の部分を削除してから、チェックを実行するようにした。

(a)先頭が < の場合に html と判定する

(b)スクリプトタグ内を JavaScript と判定する

(c)html 部分は改行のみを残して削除する

(d)スクリプトタグ内の先頭の <!-- と末尾の --> も削除する

(2)結果の内容に、未宣言変数(undeclared)、未使用変数(unused)、スコープ外参照(out of scope)

の項目を追加

(3)オプションの項目を追加 (3.を参照)

(4)エラー停止条件見直し

以下の項目については、エラーで停止せずに、解析を続行するようにした。

(a)TypeScriptが出力する名前空間のイディオムでエラー停止する件

var Namespace;

(function (Namespace) { ~ })(Namespace || (Namespace = {}));

(b)カンマ演算子でエラー停止する件

var a = 1, b = 2; // これは元々OK

var x = (1, 2);

for (i = 1, j = 1; i < 10; i++, j++) { x++; }

x = 1, y = 2;

if (x = 1, y == 2) x++;

if (x == 1) x = 1, y = 2; else z = 1;

return x++, y;

(c)if, while, do, for の { } がないとエラー停止する件

if (x == 1) y;

(d)with構文でエラー停止する件

with (x) { y = 1; } // (変数スコープは処理していない)

(e)for文の式の省略でエラー停止する件

for (;;) { break; }

(f)for文の最初の式に変数宣言があるとエラー停止する件

for (var i = 0; i < 10; i++) { x++; }

for (var k in o) { x++; }

(g)正規表現の解析でエラー停止する件

var re = /[-]/;

var re = /[/]/;

(h)数値の 00 や .01 でエラー停止する件

(ただし、070 等は 8進数 として読み込まれるため要注意)

(i)break, continue, return のセミコロン忘れでエラー停止する件

function f() { return x }

function f() { return }

(j)3項演算子内の代入でエラー停止する件

(x == 1) ? y = 1 : y = 2;

(k)else の { } がないとエラー停止する件

(l)function文の { } の後で改行しないとエラー停止する件

(m)配列の空要素でエラー停止する件

var x = [,,];

(5)アロー関数の解析処理見直し

var f = (x, y, z) => { return x + y + z; };

var f = () => { return; };

var f = (...args) => { return args[0] + args[1] + args[2]; };

(6)delete はステートメントではなく演算子

(7)正規表現の | のエスケープなしは警告を出さない

var re = /|/;

var re = /[|]/;

(8)正規表現の繰り返しマッチの数値指定ミスは停止させる

var re = /a{x}/


5.その他 制限事項等

(1)html 内の JavaScript のプログラム中に </script> という記述があると、

スクリプトタグの終了と判定して、それ以後が削除されてしまいます。

例えば <\/script> のように記述する必要があります。


(2)結果の内容の 未使用変数(unused) と スコープ外参照(out of scope) については、

function 文の巻き上げ (=スコープの先頭への移動) を考慮していないため、

実際には問題ないケースがあります。


(3)結果の内容の 関数一覧(functions) においては、function 式の関数名を推測して、

<<name>> のように表示します。

しかし、単純に直前のシンボル名を使用しているだけであるため、

正しい関数名にならないケースがあります。


(4)例外処理の例外識別子の解析が不完全です。例えば、

try { }

catch (e) { }

try { }

catch (e) { }

のような場合に、例外識別子 e が重複宣言であると報告されてしまいます。

また、catch の { } の外側で e が使用できてしまいます。


(5)with構文の変数スコープを処理していません。

エラー停止を回避しているのみです。


(6)グローバル変数の判定が一部不完全です。

(function () {

n = 1;

})();

のような場合に、n がグローバル変数と認識されません。

(未宣言変数(undeclared) としては検出されます)


(7)正規表現のエスケープの警告の中には、問題がないものもあります。

例えば、以下など。

var re = /[-]/;


6.環境等

OS : Windows 8.1 (64bit)

ブラウザ : Chrome v67

でのみ動作確認。

流用ベース : jslint.js 2016-06-19 版

report.js 2016-05-20 版

(コミット 0ab3fa9)

ライセンス : オリジナルと同様とします


7.履歴

2012-12-8 v1.00 (初版)

jslint.js 2012-10-03 版 をベースに改造

2013-1-11 v1.01 オリジナルの2012-10-11版の修正を反映

2013-1-20 v1.02 CSSの「\」で解析停止しないようにした

2013-3-2 v1.03 1行目で解析停止のとき 実行エラーになる件を対策

2013-6-19 v1.04 CSSの「/」で解析停止しないようにした

htmlファイルのデフォルトオプション選択を一部変更

(bitwiseとundefをデフォルトONに変更)

2013-6-30 v1.05 カンマ演算子で 解析停止する件を対策(「a=1,b=1」等)

関数以外のブロックで 変数スコープを作っており変になっていたので対策

for文の()の直後のセミコロンで 解析停止する件を対策

空ブロックの警告で 行数がずれる件を対策

function式のセミコロン忘れで 解析停止する件を対策

with構文で 解析停止する件を対策

(with構文の変数スコープは処理していない。解析停止を回避しているのみ)

for文の()内の式の一部省略で 解析停止する件を対策

for文の()内のvar宣言で 解析停止する件を対策

2013-8-11 v1.06 HTMLテンプレートの {% %} で解析停止する件を対策

CSSのベンダープリフィックス対応(「-webkit-xxx」等)

スクリプトタグ内にJavaScript以外のテキストデータがあるケースに対応

関数の解析で 関数名を間違えることがある件を対策

解析停止時にプロパティ検出結果が更新されない件を対策

2014-6-18 v1.07 コメント修正のみ

2016-6-26 v2.00 jslint.js 2016-06-19 版 をベースに改造をやり直した

2016-6-30 v2.01 数値の 070 等でエラーを表示する

for文の最初の式に変数宣言があるときの処理を修正

2018-6-29 v2.02 正規表現のエラーチェック見直し等(変更点の(7)(8)を追加)


<実行例>

https://hamayapp.appspot.com/static/jslint_modified.html


<ダウンロード>

jslint_modified.zip (2018-6-30)