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

时间:2010-02-26 17:03:02

标签: javascript line-numbers

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

8 个答案:

答案 0 :(得分:53)

var thisline = new Error().lineNumber

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

var stack = new Error().stack

然后通过堆栈寻找行号。

答案 1 :(得分:25)

你可以使用

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

答案 2 :(得分:22)

不同浏览器和浏览器版本之间的便携性更高(适用于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];
}

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

你可以尝试:

window.onerror = handleError;
function handleError(err, url, line){
   alert(err + '\n on page: ' + url + '\n on line: ' + line);
}

然后在你想知道的地方抛出一个错误(不是太想要,但如果你正在调试它可能对你有用。

注意:在WebKit或Opera中没有定义/处理window.onerror(我上次检查过)

答案 5 :(得分:1)

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

console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);

答案 6 :(得分:0)

如果您的代码是javascript + PHP,那么当前的PHP行号在javascript中可用作文字常量,因为它在PHP中可用<?= __LINE__ ?>

(假设您启用了PHP短标记,显然。)

因此,例如,在javascript中你可以说:

this_php_line_number = <?= __LINE__ ?>;

但是,如果你不小心,PHP行号可能与javascript行号不同,因为PHP在浏览器看到之前“吃掉”源行。因此问题变得确保您的PHP和javascript行号相同。如果它们不同,那么使用浏览器的javascript调试器就不那么令人愉快了。

您可以通过包含一个PHP语句来确保行号相同,该语句写入同步服务器端(PHP)和浏览器端(javascript)行号所需的正确数量的换行符。

以下是我的代码:

<!DOCTYPE html>
<html lang="en">
<!-- Copyright 2016, 2017, me and my web site -->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, user-scalable=yes">

<?php

...lottsa PHP stuff here, including all PHP function definitions ...

echo str_repeat("\n",__LINE__-6); # synchronize PHP and Javascript line numbers
?>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->

  <title>My web page title</title>

...lottsa HTML & Javascript stuff here...

</body>
</html>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->

关键是这个PHP声明:

echo str_repeat("\n",__LINE__-6);

这会产生足够的新行,使javascript看到的行号与PHP行号相同。所有PHP函数定义等都位于该行之前的顶部。

在该行之后,我将PHP的使用限制为不会改变行号的代码。

“-6”说明了我的PHP代码从第8行开始。如果您之前启动PHP代码,则会减少该数量。有些人把他们的PHP放在最顶端,甚至领先于DOCTYPE。

(根据此stackoverflow Q&amp; A:Chrome on android resizes font,元视口行禁用Android Chrome“字体提升”。请考虑每个网页需要的样板文件。)

以下行仅用于验证我没有犯错。在浏览器的调试器中查看,或通过右键单击/ save-web-page,它将成为HTML注释,显示正确的源文件名和行号:

<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->

变为:

<!-- *** this is line 1234 of my_file.php *** -->

现在,无论我在哪里看到行号,无论是在错误消息中还是在javascript调试器中,都是正确的。 PHP行号和javascript行号始终一致且相同。

答案 7 :(得分:0)

当然不能从Error.stack中获取行号,因为在Angular中,行号是已编译代码的行号。但是,可以获取使用哪种方法创建错误的信息。此代码段中的Logger类将这些信息添加到新的日志条目中。

https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts