17

「新しい関数を使用しないでください」および/または「評価は悪です」という長いコメントセクションを短縮するために、この質問は、可能であれば、new Function()コンストラクターの失敗に関連するエラー情報にアクセスする方法に関するものです。仕様と標準のブラウザー実装が許す範囲で JavaScript を利用しようとするときに、ブラウザーが私にできることの限界を発見することは、ほとんどの場合問題です。したがって、その免責事項を適切に設定すると、次のようになります。

new Function() 呼び出しを介してコードを評価するとき、不正な構文コードが評価されている場合、関数の内容のどこで構文エラーが発生したかを見つける方法はありますか? すなわち:

try {
  var generator = new Function(input);
  try {
    generator();
  }
  catch (runtimeError) {
    console.error("legal code; unforeseen result: ", runtimeError);
  }
}
catch (syntaxError) {
  console.error("illegal code; syntax errors: ", syntaxError);
}

ジェネレーターのビルドが失敗した場合、(jslint や別の外部ライブラリを使用せずにブラウザーから) エラーの内容や発生場所を見つける方法はありますか?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototypeは、SyntaxError にはfilenameandlinenumberプロパティがあると述べていますが、これらは new Function() を通じて評価される動的コードでは未定義です。私が知る限り、エラーオブジェクト自体に依存することは選択肢ではないようです。コードをブラウザーに導入して、新しい関数呼び出しの失敗による構文エラーがあることがわかったら、使用されている JS エンジンに応じて問題の場所を見つけるために使用できる別の方法はありますか?

(もちろん、目的が単純に構文エラーを見つけることであれば、前処理ステップとしての jslint が最適な解決策になりますが、ブラウザーが何らかの方法でこの情報を報告するようにできるかどうかにもっと興味があります。 「行/文字にいくつかのエラーがあります...」のような制限された形式の場合)

4

2 に答える 2

4

それがどこで発生したかを知ることは不可能です。しかし、エラーの内容を取得するために Exception.message を見たいと思うかもしれません。

例: http://jsbin.com/IRoDiJIV/1/watch?js

于 2013-12-09T14:30:11.623 に答える
1

評価されたコードにブレークポイントを設定する同様の方法を使用して、自分で解決策を見つけました

chrome dev tools のソース パネルで、new Function行の条件付きブレークポイントに次のコードを追加しました (これはライブラリ コードであり、変更できないためです)。

(function(eval_js, load_js) {
  try {
    eval(eval_js);
  } catch (e) {
    (function addCode(js) {
      var e = document.createElement('script');
      e.type = 'text/javascript';
      e.src = 'data:text/javascript;charset=utf-8,' + escape(js);
      document.body.appendChild(e);
      console.warn("Inserted Script for ", js);
    })(load_js.replace(/;/g,";\n"));
    handlerCode = "";
    return false;
  }
  return false;
})("new Function('event', handlerCode)", handlerCode)
于 2013-12-09T14:51:48.327 に答える