10

私は常に、strict mode廃止されたメソッドや誤解されやすい構文を使用するなどの Javascript 言語の問題から保護される (または少なくともコードを変更するように強制的に指示される) ことを望んでコーディングしています。

しかし、私は今日この問題に遭遇し、ブラウザでセミコロンの挿入を無効にする方法があるかどうか、または厳密モードと同様の「コンパイル」時のエラーが発生するかどうか疑問に思っていましたか?

JS[H/L]int は、JS インタープリターがセミコロンを挿入する場所を見つけて、軽減するためにそれらにフラグを立てることができませんか?


編集

キーワードの後に​​セミコロンが見つかる前に新しい行が存在する場合、JShintJSLintreturnはどちらもエラーになります。ただし、自動挿入に関する他の警告と、それらがそれぞれ検出されるかどうかについてはわかりません。
とにかく、答えが実際に「無効化」部分を解決する場合、それはより関連性があります。

4

2 に答える 2

1

キーワードの後の式returnは、常にキーワードと同じ行で開始する必要があります。これはインタープリターに関連していません。ECMAScript 標準で定義されています。言語の悪い部分ですが、Douglas によって記述された JS コードの記述規則を尊重する場合クロックフォードなら、二度とこれに遭遇することはありません。

Douglas Crockford による「JavaScript: 良い部分」から (付録 A.3 ひどい部分):

JavaScript には、セミコロンを自動的に挿入することによって、誤ったプログラムを修正しようとするメカニズムがあります。これに依存しないでください。より重大なエラーを隠すことができます。

歓迎されない場所にセミコロンを挿入することがあります。return ステートメントにセミコロンを挿入した場合の結果を考慮してください。return ステートメントが値を返す場合、その値式は return と同じ行で開始する必要があります。

return
{
    status: true
};

これは、ステータス メンバを含むオブジェクトを返すようです。残念ながら、セミコロンを挿入すると、undefined を返すステートメントになります。セミコロンの挿入がプログラムの誤解を引き起こしたという警告はありません。{ を次の行の先頭ではなく、前の行の末尾に配置すると、この問題を回避できます。

return {
    status: true
};

Douglas Crockford による JavaScript のコード規則も参照してください: http://javascript.crockford.com/code.html

于 2013-08-28T08:02:17.950 に答える
1

この質問に出くわした人を助けると思っただけです。
プロジェクトの JS を縮小するためにGoogle のClosure Comilerを使い始めたところ、いくつかの便利な警告が表示されました。

   $> java -jar google_closure_compiler.jar  --language_in=ECMASCRIPT5_STRICT --js_output_file 'min.js' 'file1.js' 'file2.js'
   file1.js:152: WARNING - unreachable code
               getSomething(function() { return this.doThingo(''); });
               ^

   file2.js:203: WARNING - Suspicious code. The result of the 'add' operator is not being used.
               ' to ' + (typeof obj);
               ^

   0 error(s), 2 warning(s)

問題のあるコードブロックは次のとおりです(コメントは、コンパイラが警告したコードに何が欠けているかを説明しています):

file1.js:150

    return generateSomeObject(bunch, of, arguments)
        //the period before the function call was missing
        getSomething(function() { return this.doThingo(''); });
}

file2.js:201

if (someCondition)
    //trailing plus was missing from this line
    throw 'Could not set ' + last + ' of ' + (typeof root)
        ' to ' + (typeof obj);
return old;

ブラウザが片付けたすべての間違いを認識できるかどうかはわかりませんが(したがって、おそらくこれを回答としてマークしません)、YUI のミニファイヤが私のために行っていたよりもはるかに多くのことを行います (これらすべてを無視していました)。ケース)。
また、YUI と比較して、コンパイラは複数のファイル入力を受け取ることができるため、エラーのファイルごとに行番号を表示でき、debuggerキーワードのエラー/再解釈は発生しません)。
うまくいけば、それもあなたを助けるでしょう。

于 2015-04-07T04:28:15.863 に答える