Есть ли у JavaScript механизм определения номера строки текущего исполняемого оператора (и если да, что это такое)?
Как определить текущий номер строки в JavaScript?
Ответ 1
var thisline = new Error().lineNumber
Если это не работает в любой среде, которую вы используете, вы можете попробовать:
var stack = new Error().stack
Затем пройдите через стек для номера строки.
Ответ 2
вы можете использовать
function test(){
console.trace();
}
test();
Ответ 3
Немного более портативен между разными браузерами и версиями браузера (должен работать в 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 '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 frame. It 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];
}
Ответ 4
Вы можете попытаться проанализировать источник функции, чтобы найти некоторые отметки.
Вот краткий пример (да, он немного испортился).
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;
}
Ответ 5
вы можете попробовать:
window.onerror = handleError;
function handleError(err, url, line){
alert(err + '\n on page: ' + url + '\n on line: ' + line);
}
затем выбросьте ошибку, где вы хотите знать (не слишком желательно, но это может помочь вам, если вы отлаживаете.
Примечание: window.onerror
не определяется/не обрабатывается в WebKit или Opera (последний раз, когда я проверил)
Ответ 6
введите в код следующий фрагмент кода:
console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);
Ответ 7
Если ваш код javascript + PHP, то текущий номер строки PHP доступен в javascript как константа литерала, потому что он доступен в PHP как <?= __LINE__ ?>
(Предположим, что у вас есть короткие короткие PHP-теги.)
Итак, например, в javascript вы можете сказать:
this_php_line_number = <?= __LINE__ ?>;
Однако, если вы не будете осторожны, номер строки в PHP может отличаться от номера строки javascript, потому что PHP "ест" исходные строки до того, как браузер их увидит. Таким образом, проблема становится гарантией того, что ваши номера строк в PHP и javascript будут одинаковыми. Если они отличаются друг от друга, это делает использование отладчика javascript браузера намного менее приятным.
Вы можете обеспечить, чтобы номера строк были одинаковыми, включая инструкцию PHP, которая записывает правильное количество строк новой строки, необходимых для синхронизации номеров строк на стороне сервера (PHP) и brower-side (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.
(В строке мета-видового экрана отключается "увеличение шрифта" на Android Chrome в этом стеке Q & A: Chrome на андроиде изменяет размер шрифта. Рассмотрим его шаблон, который на каждой веб-странице необходимо.)
Следующая строка предназначена только для проверки того, что я не ошибся. Просмотренный в отладчике браузера или по щелчку правой кнопкой мыши/save-web-странице, он становится комментарием HTML, который показывает правильное имя исходного файла и номер строки:
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
становится:
<!-- *** this is line 1234 of my_file.php *** -->
Теперь, когда я вижу номер строки, будь то в сообщении об ошибке или в отладчике javascript, это правильно. Номера строк в PHP и номера строк в javascript всегда согласованы и идентичны.