Как я могу определить текущий номер строки в JavaScript? - PullRequest
72 голосов
/ 26 февраля 2010

Есть ли в JavaScript механизм определения номера строки выполняемого в данный момент оператора (и если да, то что это)?

Ответы [ 7 ]

53 голосов
/ 26 февраля 2010

var thisline = new Error().lineNumber

Если это не работает в любой среде, которую вы используете, вы можете попробовать:

var stack = new Error().stack

Затем ищите в стеке номер строки.

25 голосов
/ 16 апреля 2015

вы можете использовать

function test(){
    console.trace();
}
test();
22 голосов
/ 22 ноября 2014

Немного более переносимо между различными браузерами и версиями браузера (должно работать в 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 голосов
/ 26 февраля 2010

Вы можете попытаться проанализировать источник функции, чтобы найти некоторые метки.
Вот быстрый пример (да, это немного запутано).

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;
}
1 голос
/ 07 марта 2014

вставьте следующий фрагмент в ваш код:

console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);
1 голос
/ 26 февраля 2010

вы можете попробовать:

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

затем выдайте ошибку, которую вы хотите знать (не слишком желательно, но она может помочь вам, если вы отлаживаете.

Примечание: window.onerror не определено / не обрабатывается в WebKit или Opera (последний раз, когда я проверял)

0 голосов
/ 26 января 2017

Если ваш код 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.

(Строка метапортпорта отключает «усиление шрифтов» в Android Chrome в соответствии с этим стековым потоком вопросов и ответов: Chrome на Android изменяет размер шрифта . Считайте, что это шаблон, который необходим каждой веб-странице.)

Следующая строка просто для подтверждения того, что я не ошибся. При просмотре в отладчике браузера или по щелчку правой кнопкой мыши / сохранить веб-страницу он становится комментарием HTML, который показывает правильное имя исходного файла и номер строки:

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

становится:

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

Теперь, где бы я ни увидел номер строки, будь то в сообщении об ошибке или в отладчике javascript, это правильно. Номера строк PHP и номера строк JavaScript всегда согласованы и идентичны.

...