带有行和列偏移的Javascript的Eval字符串
Eval String of Javascript with Line and Column Offset?
有人知道一种评估字符串的方法吗?这样,如果它(或它定义的函数)生成错误,堆栈跟踪中显示的行号和列号将偏移预先指定的量?或者,假设我想把一个长的源字符串分解成块,并分别对它们进行求值,但仍然得到堆栈跟踪,看起来整个字符串都是一次性求值的。除了使用空行和空列之外,还有什么方法可以达到这种效果吗?(我需要一个基于浏览器的解决方案,最好是跨浏览器的,但我可以满足于至少在一个主要浏览器上工作的东西。)
我认为这是不可能的,因为假设有效的底层机制实际上已经被弃用了。出于安全原因,浏览器不再将错误对象传递给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拒绝将错误对象传递给oneror回调(奇怪的是,这个问题只发生在评估代码中),IE忽略了sourceURL指令。
相关文章:
- Javascript eval()无法处理传递的字符串
- Semi-sandboxing Javascript eval
- javascript eval方法语法
- JavaScript eval() and const
- mongo javascript --eval is failing
- Javascript eval查询字符串
- javascript eval删除问号后的所有内容
- Javascript eval(0047) returns 39
- Javascript eval - obfuscation?
- JavaScript eval in JavaApplication: "javax.script.scrip
- JavaScript eval(“{}”) 返回行为
- 获取 eval 的“窗口”对象,并列出所有变量?Javascript eval inline html.
- 如何将二进制文字传递给 JavaScript eval
- 你如何让 javascript eval 返回一个字符串而不是一个变量
- Javascript eval() for Json 字符串注入了全局作用域函数
- JavaScript eval() 失败与 window.external.notify(),适用于 window.al
- Javascript eval 在计算数学表达式时,如果使用的数字以 0 开头,则给出错误的输出
- Javascript - eval() `{}` expression
- 如何避免此javascript eval()
- 客户端上用于运行不受信任代码的JavaScript eval()