__LINE__相当于Javascript

时间:2009-01-17 09:04:48

标签: javascript

有没有办法在Javascript中获取源代码行,例如__LINE__用于C或PHP?

7 个答案:

答案 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__