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

IT技术 javascript line-numbers
2021-02-03 07:42:09

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

6个回答

var thisline = new Error().lineNumber

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

var stack = new Error().stack

然后在堆栈中寻找行号。

我认为.lineNumber只适用于 Firefox
2021-03-30 07:42:09
IE 上的某处有一个行号。我知道这一点是因为当我的 javascript 抛出错误时,它说它在一个数字大于 1 亿的线上。
2021-04-03 07:42:09
我没有得到正确的数字,它应该是 1250 时是 1350。
2021-04-03 07:42:09
问题:如果您使用的是 PHP,javascript 看到的“源代码”不是原始源代码,因此它的行号是错误的。(这可能是 Hermann 正在发生的事情。)有谁知道如何让 javascript 看到原始的 PHP 源代码行号?该解决方案可能涉及某种“源地图”生成,但我找不到如何去做。这当然是一个已解决的问题,对吧?
2021-04-10 07:42:09
在 IE 中lineNumber不起作用,错误对象上不存在属性。也没有stack:-)
2021-04-13 07:42:09

您可以使用:

function test(){
    console.trace();
}

test();
迄今为止最简单的解决方案,它甚至适用于 MS Edge。
2021-04-03 07:42:09

在不同浏览器和浏览器版本之间更具可移植性(应该适用于 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];
}
谢谢。我调整了你的建议:stackoverflow.com/a/37081135/470749
2021-03-20 07:42:09
警告,不适用于 Chrome 的 ViolentMonkey 脚本 - 您会得到一个假数字,不知道为什么。
2021-03-20 07:42:09
如果您调整正则表达式,您可以同时返回行号和列号:var frameRE = /:(\d+:\d+)[^\d]*$/;这更有用,尤其是当 JS 被缩小为一个长行时。
2021-04-06 07:42:09

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

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;
}

将以下代码段注入您的代码:

console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);
我无法让它发挥作用。我明白了TypeError: /\(http:[\w\d/.-]+:([\d]+)/.exec(...) is null
2021-03-20 07:42:09
根据需要替换协议名称(例如“http:”)
2021-04-02 07:42:09