如何确定JavaScript中的当前行号?

Mat*_*och 78 javascript line-numbers

JavaScript是否有一种机制来确定当前正在执行的语句的行号(如果是,它是什么)?

z5h*_*z5h 56

var thisline = new Error().lineNumber

如果这在您使用的任何环境中都不起作用,您可以尝试:

var stack = new Error().stack

然后通过堆栈搜索行号.

  • 在IE中不起作用,错误对象上不存在`lineNumber`属性.`stack`也不是:-) (3认同)

bal*_*ena 28

您可以使用

function test(){
    console.trace();
}
test();
Run Code Online (Sandbox Code Playgroud)

  • 迄今为止最简单的解决方案,它甚至适用于 MS Edge。 (2认同)

jwa*_*att 23

在不同的浏览器和浏览器版本之间更容易移植(应该可以在Firefox,Chrome和IE10 +中使用):

function ln() {
  var e = new Error();
  if (!e.stack) try {
    // IE requires the Error to actually be throw or else the Error's 'stack'
    // property is undefined.
    throw e;
  } catch (e) {
    if (!e.stack) {
      return 0; // IE < 10, likely
    }
  }
  var stack = e.stack.toString().split(/\r\n|\n/);
  // We want our caller's frame. It's index into |stack| depends on the
  // browser and browser version, so we need to search for the second frame:
  var frameRE = /:(\d+):(?:\d+)[^\d]*$/;
  do {
    var frame = stack.shift();
  } while (!frameRE.exec(frame) && stack.length);
  return frameRE.exec(stack.shift())[1];
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你调整正则表达式,你可以返回行号和列号: `var frameRE = /:(\d+:\d+)[^\d]*$/;` 这更有用,特别是当 JS 被缩小时排成一长队。 (3认同)

Mik*_*rov 5

你可以尝试解析一个函数的源来寻找一些标记。
这是一个简单的例子(是的,它有点混乱)。

function foo()  
{       
    alert(line(1));
    var a;
    var b;      
    alert(line(2));
}   
foo();

function line(mark)
{
    var token = 'line\\(' + mark + '\\)';       
    var m = line.caller.toString().match(
        new RegExp('(^(?!.*' + token + '))|(' + token + ')', 'gm')) || [];
    var i = 0;
    for (; i < m.length; i++) if (m[i]) break;
    return i + 1;
}
Run Code Online (Sandbox Code Playgroud)