5

実際に評価せずに、スニペットが有効な JavaScript であるかどうかをテストする関数はありますか? つまり、

function validate(code){
    try { eval(code); } 
    catch(err) { return false; }
    return true;
};

副作用なし。

4

2 に答える 2

12

はいあります。

new Function(code);

SyntaxErrorコードが有効な Javascript でない場合にスローします。( ECMA-262、エディション 5.1、§15.3.2.1 は、解析できない場合に例外をスローすることを保証しますcode)。

注意: このスニペットは、構文の有効性のみをチェックします。たとえば、未定義の参照が原因でコードが例外をスローすることがあります。コードを評価する (そしてそのすべての副作用を取得する) か、コードを解析してその実行をエミュレートする (つまり、JS で JS 仮想マシンを作成する) 必要があります。

于 2013-03-11T07:41:29.197 に答える
2

esprimaを使用できます。

Esprima (esprima.org) は、ECMAScript (一般に JavaScript としても知られています) で記述された、高性能で標準に準拠した ECMAScript パーサーです。

特徴

  • ECMAScript 5.1 (ECMA-262) の完全サポート
  • Mozilla Parser AST と互換性のある実用的な構文ツリー形式
  • 十分にテストされています (100% の確実なステートメント カバレッジを備えた 550 件を超える単体テスト)
  • オプションの構文ノード位置の追跡 (インデックスベースおよび行 - 列)
  • ES6/Harmony の実験的サポート (モジュール、クラス、分解など)

オンライン構文検証ツールを使用するか、 npm パッケージとしてインストールして、コマンド ラインからローカルで実行できます。と の 2 つのコマンドがありesparseますesvalidateesvalidate得られます (上記のオンライン構文検証ツールの例を参照):

$ esvalidate foo.js 
foo.js:1: Illegal return statement
foo.js:7: Octal literals are not allowed in strict mode.
foo.js:10: Duplicate data property in object literal not allowed in strict mode
foo.js:10: Strict mode code may not include a with statement

完全を期すために、 ASTesparseを生成します。

于 2013-03-11T08:05:53.143 に答える