は、それ(あるいはそれが定義する関数は)エラーが発生した場合、スタックトレースに示されている行番号と列番号が事前に指定した量によって相殺されるように、文字列をevalするための方法のいずれかを知っていますか? また、長いソース文字列をチャンクに分割して別々に評価したいが、文字列全体が一度に評価されたかのように見えるスタックトレースを取得したいとします。空の行と列を使用することを除いて、この効果を達成する方法はありますか? (私は、好ましくは、クロスブラウザ、ブラウザベースのソリューションが必要ですが、私は主要なブラウザの少なくとも一方に働く何かのために解決することができます。)Eval行と列のオフセットを持つJavascriptの文字列?
答えて
私がこれまでに見つけた最良の解決策は、それがevalされたています前に、スタックトレース内の一意のファイル名の形でそれにマーカーを与えて、各文字列にsourceURLにディレクティブを付加することです。スタックトレースは、(パーサーコンポーネントstacktracejsを使用して)解析され、マーカーに関連付けられているラインオフセットを参照して修正されます。
var evalCounter = 0;
var lineCounter = 0;
var lineOffsetTable = {};
function myEval(code) {
lineOffsetTable[evalCounter] = lineCounter;
lineCounter += countLines(code);
return eval("//# sourceURL=" + (evalCounter++) + "\n" + code);
}
window.onerror = function(errorMsg, url, lineNumber, column, e) {
var stackFrames = ErrorStackParser.parse(e);
logStackTrace(stackFrames.map(function(f) {
if(f.fileName in lineOffsetTable)
f.lineNumber += lineOffsetTable[f.fileName];
return f;
}));
};
残念ながら、これは現時点ではFirefoxでのみ機能します。 Chromeはエラーオブジェクトをonerrorコールバックに渡すことを拒否します(evalされたコードでのみ発生し、不思議な問題です)、IEはsourceURLディレクティブを無視します。
私はそれが根底にあるメカニズムので、可能だとは思いません想定される作業は実際にはdeprecatedです。セキュリティ上の理由から、ブラウザはエラーオブジェクトをJavascriptに渡すことはありません。
あなたはJavascriptにコンパイルされるカスタムプログラミング言語で作業しているので、あなたは結果のスクリプトの構造がどうなるか知っています。また、結果のJavascriptに文カウンタを導入することもできます。最後に実行されたことがわかるようになります。ような何か:
function(1); function(2);
function(3);
のように翻訳することができます。
12はもちろん.Of"function(n);".length
ある
var __column=0;
var __line=0;
function(1); __column+=12;
function(2); /*__column+=12;*/ __line++; __column=0;
function(3); /*__column+=12;*/ __line++; __column=0;
、結果のコードは醜いですが、デバッグフラグか何かでこの動作を可能にすることができます。
エラーオブジェクトを取得することはできますが、提供された行/列のペアが一意でない場合は、実際には役に立ちません。 (そして、私は別々のコードを別々に評価しているので、そうではありません。)私が興味を持っているのは、何とかJSエンジンに、適切なスタックトレースを生成するように指示することです。これはNodeJSのvmモジュールを使って可能ですが、ブラウザで同じことをする方法を探しています。 – user3026691
提案された解決策に関しては、実行が行われた最後の場所は、それ自身では特に有用ではないので、関数が入力/返却されるたびにスタックを維持する必要があります。 また、一時変数を使用してa(b(c))やa + b + cのようなものを平坦化する必要があります。これはすべての操作の定型文であり、私の主な使用例(ゲーム開発)には望ましくないものです。 開発プロセス中にパフォーマンスが低下したとしても、展開された製品でこの機能をオフにしていたので、ユーザーに発生したエラーはデバッグするのが難しくなります。 – user3026691
評価版で使用されている文字列をJSファイルにダンプするのはなぜですか... – IMTheNachoMan
- 1. eval:動的値を持つjqueryチェーン文字列を実行
- 2. 配列としての文字列オフセット
- 3. ロングevalの文字列
- 4. evalとsetTimeoutの差は文字列コード
- 5. マスク文字列を持つ文字列
- 6. '√'を持つ文字列をeval()に与えることができる文字列に変換します。
- 7. 、連結文字列とevalを
- 8. 私は、文字列持つ文字列
- 9. HTML5データ文字列をJavaScript(evalなし)として実行しますか?
- 10. は、私は、次の2つの文字列持つ文字列
- 11. JavaScriptで特殊文字を持つオブジェクトを文字列化
- 12. は、私は次の文字列の行列を持つベクトルMATLAB
- 13. = '1月' という文字列を持つ文字列
- 14. Pythonのパンダは、私は文字列と整数の列を持つデータフレームを持つ文字列条件
- 15. iMacrosのEVALステートメントを使用してJavascript配列から文字列を取得
- 16. 文字列の最長部分文字列を持つ行を選択
- 17. 文字列のオフセットを取得する
- 18. 分割文字列とは、私は、文字列持つ
- 19. のPostgreSQL:私は次の文字列持つ文字列
- 20. ActiveSupport :: TimeZoneオフセットの文字列のリスト
- 21. 'unsafe-eval'のためJavaScriptを文字列として評価しない
- 22. 文字列配列。私は、以下の文字列配列を持つ
- 23. 文字列配列を持つコンビナトリアル
- 24. JSON文字列を持つPHP配列
- 25. 私はこのような文字列を持つアレイのJavascript
- 26. ループと文字列の配列を持つJMenuBarの作成エラー
- 27. 文字列内のJavascript文字列
- 28. JavaScriptの文字列とオブジェクト
- 29. 先行スペースを持つ文字列配列を作成する
- 30. 20文字以上の文字列を持つJavascriptの正規表現
おそらくsourcemapsは、移動するための方法ですが、私は彼らがeval' 'で動作するかどうかはわかりません。 – Bergi
ソースマップは、チャンクを評価する単一の文字列に連結するツールで生成する必要がありますが、特定のチャンクで定義された関数が生成過程で使用されるため、チャンクを個別に評価する必要があります後のチャンク。 – user3026691
なぜあなたはこれをしたいですか? –