具有行和列偏移的 Javascript 的评估字符串?
Eval String of Javascript with Line and Column Offset?
有谁知道评估字符串的方法,如果它(或它定义的函数)产生错误,堆栈跟踪中显示的行号和列号将偏移预先指定的数量?
或者,假设我想将一个长源字符串分解成多个块并分别对它们求值,但仍然得到堆栈跟踪,看起来好像整个字符串都是一次性求值的。除了使用空行和空列之外,有什么方法可以实现这种效果吗? (我需要一个基于浏览器的解决方案,最好是跨浏览器,但我可以满足于至少在一种主要浏览器上工作的东西。)
我认为这不可能,因为假定工作的底层机制实际上是 deprecated。出于安全原因,浏览器不再将错误对象传递给 Javascript。
但是,由于您使用的是编译成 Javascript 的自定义编程语言,因此您知道生成的脚本的结构。您还可以在结果 Javascript 中引入语句计数器,这样您就可以始终知道最后执行的是什么。类似于:
function(1); function(2);
function(3);
可译为:
var __column=0;
var __line=0;
function(1); __column+=12;
function(2); /*__column+=12;*/ __line++; __column=0;
function(3); /*__column+=12;*/ __line++; __column=0;
其中 12 是 "function(n);".length
。当然,生成的代码很丑陋,但您可以使用调试标志或其他方式启用此行为。
到目前为止,我发现的最佳解决方案是在每个字符串被求值之前为每个字符串添加一个 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 回调(这个问题只发生在经过评估的代码中,很奇怪)并且 IE 忽略了 sourceURL 指令。
有谁知道评估字符串的方法,如果它(或它定义的函数)产生错误,堆栈跟踪中显示的行号和列号将偏移预先指定的数量? 或者,假设我想将一个长源字符串分解成多个块并分别对它们求值,但仍然得到堆栈跟踪,看起来好像整个字符串都是一次性求值的。除了使用空行和空列之外,有什么方法可以实现这种效果吗? (我需要一个基于浏览器的解决方案,最好是跨浏览器,但我可以满足于至少在一种主要浏览器上工作的东西。)
我认为这不可能,因为假定工作的底层机制实际上是 deprecated。出于安全原因,浏览器不再将错误对象传递给 Javascript。
但是,由于您使用的是编译成 Javascript 的自定义编程语言,因此您知道生成的脚本的结构。您还可以在结果 Javascript 中引入语句计数器,这样您就可以始终知道最后执行的是什么。类似于:
function(1); function(2);
function(3);
可译为:
var __column=0;
var __line=0;
function(1); __column+=12;
function(2); /*__column+=12;*/ __line++; __column=0;
function(3); /*__column+=12;*/ __line++; __column=0;
其中 12 是 "function(n);".length
。当然,生成的代码很丑陋,但您可以使用调试标志或其他方式启用此行为。
到目前为止,我发现的最佳解决方案是在每个字符串被求值之前为每个字符串添加一个 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 回调(这个问题只发生在经过评估的代码中,很奇怪)并且 IE 忽略了 sourceURL 指令。