如何确定 JavaScript 中的当前行号?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2343343/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I determine the current line number in JavaScript?
提问by Matthew Murdoch
Does JavaScript have a mechanism for determining the line number of the currently executing statement (and if so, what is it)?
JavaScript 是否具有确定当前执行语句的行号的机制(如果有,它是什么)?
回答by z5h
var thisline = new Error().lineNumber
var thisline = new Error().lineNumber
If that doesn't work in whatever environment you're using, you can try:
如果这在您使用的任何环境中都不起作用,您可以尝试:
var stack = new Error().stack
var stack = new Error().stack
Then hunt through the stack for the line number.
然后在堆栈中寻找行号。
回答by baligena
You can use:
您可以使用:
function test(){
console.trace();
}
test();
回答by jwatt
A bit more portable between different browsers and browser versions (should work in Firefox, Chrome and IE10+):
在不同浏览器和浏览器版本之间更具可移植性(应该适用于 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];
}
回答by Mikhail Nasyrov
You can try to parse a source of a function to seek some marks.
Here is a quick example (yes, it's messed a little).
您可以尝试解析一个函数的源来寻找一些标记。
这是一个简单的例子(是的,它有点混乱)。
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;
}
回答by crishushu
Inject the following snippet to your code:
将以下代码段注入您的代码:
console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);
回答by scunliffe
You can try:
你可以试试:
window.onerror = handleError;
function handleError(err, url, line){
alert(err + '\n on page: ' + url + '\n on line: ' + line);
}
Then throw an error where you want to know (not overly desired, but it might help you if you are debugging.
然后在您想知道的地方抛出一个错误(不是太想要,但如果您正在调试,它可能会对您有所帮助。
Note: window.onerrorisn't defined/handled in WebKitor Opera(the last time I checked)
回答by Viree
Purely one can't get the line number out of Error.stack, because in Angular the line number is the line number of the compiled code. But one can get the info in which method the error was created. The class Logger in this code snippet add this piece of information to a new logbook entry.
纯粹是无法从 Error.stack 中获取行号,因为在 Angular 中,行号是编译代码的行号。但是可以获取创建错误的方法的信息。此代码片段中的类 Logger 将此信息添加到新的日志条目中。
https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts
https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts
回答by Dave Burton
If your code is JavaScript + PHP, then the current PHP line number is available in JavaScript as a literal constant, because it's available in PHP as <?= __LINE__ ?>
如果您的代码是 JavaScript + PHP,那么当前 PHP 行号在 JavaScript 中可作为文字常量使用,因为它在 PHP 中可作为 <?= __LINE__ ?>
(That's assuming you have PHP short tags enabled, obviously.)
(这显然是假设您启用了 PHP 短标签。)
So, for example, in JavaScript you can say:
因此,例如,在 JavaScript 中,您可以说:
this_php_line_number = <?= __LINE__ ?>;
However, if you are not careful, the PHP line number might be different from the JavaScript line number, because PHP "eats" source lines before the browser ever sees them. So the problem becomes ensuring that your PHP and JavaScript line numbers are the same. If they're different it makes using the browser's JavaScript debugger a lot less pleasant.
但是,如果您不小心,PHP 行号可能与 JavaScript 行号不同,因为 PHP 在浏览器看到它们之前“吃掉”了源代码行。所以问题就变成了确保你的 PHP 和 JavaScript 行号相同。如果它们不同,那么使用浏览器的 JavaScript 调试器就不那么愉快了。
You can ensure the line numbers are the same by including a PHP statement that writes the correct number of newlines needed to synchronize server-side (PHP) and browser-side (JavaScript) line numbers.
您可以通过包含一个 PHP 语句来确保行号相同,该语句写入同步服务器端 (PHP) 和浏览器端 (JavaScript) 行号所需的正确换行数。
Here's what my code looks like:
这是我的代码的样子:
<!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
...lots of 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>
...lots of HTML and JavaScript stuff here...
</body>
</html>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
The key is this PHP statement:
关键是这个 PHP 语句:
echo str_repeat("\n",__LINE__-6);
That's spits out enough newlines to make the line number seen by JavaScript be the same as the PHP line number. All the PHP function definitions, etc. are at the top, ahead of that line.
这会吐出足够多的换行符,使 JavaScript 看到的行号与 PHP 行号相同。所有 PHP 函数定义等都在顶部,在该行之前。
After that line, I restrict my use of PHP to code that doesn't change the line numbers.
在该行之后,我将 PHP 的使用限制为不更改行号的代码。
The "-6" accounts for the fact that my PHP code starts on line 8. If you start your PHP code earlier, you'll reduce that number. Some people put their PHP right at the very top, even ahead of the DOCTYPE.
“-6”说明我的 PHP 代码从第 8 行开始。如果您更早开始 PHP 代码,您将减少该数字。有些人把他们的 PHP 放在最顶端,甚至在 DOCTYPE 之前。
(The meta viewport line disables Android Chrome "font boosting" per this Stack Overflow Q&A: Chrome on Android resizes font. Consider it boilerplate, which every web page needs.)
(元视口行根据此 Stack Overflow Q&A:Chrome on Android resizes font禁用 Android Chrome“字体增强” 。考虑它的样板,每个网页都需要。)
The following line is just for verifying that I haven't made a mistake. Viewed in the browser's debugger, or by right-click / save-web-page, it becomes an HTML comment which shows the correct source file name and line number:
下面这行只是为了验证我没有犯错。在浏览器的调试器中查看,或通过右键单击 / save-web-page,它会变成一个 HTML 注释,显示正确的源文件名和行号:
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
becomes:
变成:
<!-- *** this is line 1234 of my_file.php *** -->
Now, wherever I see a line number, whether it's in an error message or in the JavaScript debugger, it's correct. PHP line numbers and JavaScript line numbers are always consistent and identical.
现在,无论我在哪里看到行号,无论是在错误消息中还是在 JavaScript 调试器中,它都是正确的。PHP 行号和 JavaScript 行号始终一致且相同。

