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

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

var thisline = new Error().lineNumber

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

var stack = new Error().stack

然后通过堆栈search行号。

您可以使用

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

在不同的浏览器和浏览器版本之间可移植一点(可以在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]; } 

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

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

你可以试试:

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

然后在你想知道的地方抛出一个错误(不是太想要,但是如果你正在debugging,它可能会帮助你。

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

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

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

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

(这是假设你有PHP短标签启用,显然。)

所以,例如,在JavaScript中你可以说:

 this_php_line_number = <?= __LINE__ ?>; 

然而,如果你不小心,PHP的行号可能会不同于JavaScript的行号,因为在浏览器看到它们之前,PHP会“吃掉”源代码行。 所以问题就变成确保你的PHP和javascript行号是一样的。 如果它们不同,那么使用浏览器的JavaScriptdebugging器就不那么令人愉快了。

您可以通过包含一个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代码,你将会减less这个数字。 有些人把他们的PHP放在最前面,甚至在DOCTYPE之前。

(元视口行禁用Android Chrome“字体提升”每个这个stackoverflow问题和答案 : Android上的Chrome调整字体大小,考虑它样板,每个网页需要。

下面这行只是为了validation我没有犯错。 在浏览器的debugging器中查看,或通过右键单击/ save-web-page,它将成为一个HTML注释,显示正确的源文件名和行号:

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

变为:

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

现在,无论我在哪里看到行号,无论是在错误消息还是在javascriptdebugging器中,都是正确的。 PHP行号和javascript行号总是一致的。