2010年12月30日木曜日

Javascriptで、Javascriptが文法的に正しいか確認する

以下のような関数で、引数の文字列がJavascriptとして正しいか確認できます。
正しい場合false、何か間違いがあれば簡単なエラーメッセージを返します。

// スクリプトに文法エラーがあるか
function checkScript(script) {
  var ret = false;
  try{
    eval('if(0){'+script+'}');
  } catch(e){
    ret = e.message;
  }
  return ret;
}
上記関数は、スクリプトを実行しないように「if(0){}」を付けて実行し、エラーがあるかチェックします。渡されたスクリプトは結局実行されないので、ランタイムエラーの確認はできません。

Textareaでデータとしてjavascriptを入力させたい時などに役に立つかと思います。

ブラウザをFireFoxに限れば、少しコードは複雑になりますが、エラーの発生した行番号も取得することが可能です。少々トリッキーですが、tryの前でエラーオブジェクトをnewしてその行番号を調べることにより、evalの行番号を求め、catch中でeのエラー行の行番号から、evalの行番号を引いた結果に1を足したものが、入力スクリプトのエラー行になります。残念ながらIEではエラーオブジェクトから行番号が取得できないようです。

// スクリプトに文法エラーがあるか(行番号付き)
function checkScript(scr) {
 var ret = false;
 if (!window._lineEval) _lineEval=(new Error()).lineNumber+2 || -1;
 try{
  eval('if(0){'+scr+'}');
 } catch(e){
  ret = {
   line:(e.lineNumber?e.lineNumber-_lineEval+1:-1),
   msg:e.message
  };
 }
 return ret;
}

0 件のコメント:

コメントを投稿