有没有办法在Javascript中获取源代码行,例如__LINE__
用于C或PHP?
答案 0 :(得分:10)
有一种方法,虽然更昂贵:抛出异常,立即捕获它,并从堆栈跟踪中挖出第一个条目。有关如何解析跟踪的示例here。同样的技巧也可以在普通Java中使用(如果代码是在打开调试信息的情况下编译的)。
修改:显然并非所有浏览器都支持此操作。好消息是(感谢评论,Christoph!),有些浏览器会导出源文件名和行号directly through the fileName
and lineNumber
properties of the error object。
答案 1 :(得分:6)
简短的回答是否。
答案很长,取决于您的浏览器,您可能会抛出&捕获异常并拉出堆栈跟踪。
我怀疑你正在使用它进行调试(我希望如此!)所以你最好的选择是使用Firebug。这将给你一个console
对象;你可以随时调用console.trace()
来查看你的程序在做什么而不会破坏执行。
答案 2 :(得分:3)
C中的__LINE__
由preprocessor扩展,它将字面上的当前输入的行号替换掉。所以,当你看到
printf("Line Number: %d\r\n", __LINE__);
编译器看到:
printf("Line Number: %d\r\n", 324);
实际上,该程序中的数字(在这种情况下为324)是HARDCODED。只有这种双通机制才能实现这一目标。
我不知道PHP如何实现这一点(它是否也经过预处理?)。
答案 3 :(得分:2)
您可以尝试在javascript文件上运行C预处理器(来自GNU Compiler Collection的f {。cpp
- 动态地对每个请求或静态运行,每次更改javascript文件时都应用此操作。我认为javascript语法足够相似,可以使用。
然后你将拥有C预处理器的所有功能。
答案 4 :(得分:0)
有一种解决方法。
通常__ LINE __与__ FILE __结合用于在代码中标记位置,并且标记完成以便稍后查找该位置。
但是,通过使用全局唯一标识符(GUID-s)代替__ LINE __和__ FILE __,可以实现相同的效果。该解决方案的详细信息位于BSD许可工具集的COMMENTS.txt中,该工具集可自动执行该过程。
答案 5 :(得分:0)
我认为预处理更有意义,因为它不会增加运行时开销。 C预处理器的替代方法是使用perl,如下面的两步过程:
1 - 将“Line#999 \ n”添加到脚本中您想要编号的每一行,例如
alert ( "Line # 999 \n"+request.responseText);
2 – run the perl below:
cat my_js.js | perl -ane "{ s/Line # \d+ /Line # $. /; print $_;}" > C_my_js.js; mv C_my_js.js my_js.js
答案 6 :(得分:0)
您可以在香草JS中使用它:
function getLine(offset) {
var stack = new Error().stack.split('\n'),
line = stack[(offset || 1) + 1].split(':');
return parseInt(line[line.length - 2], 10);
}
Object.defineProperty(window, '__LINE__', {
get: function () {
return getLine(2);
}
});
您现在可以访问全局变量__LINE__