Есть ли способ получить номер исходной строки в Javascript, например __LINE__ для C или PHP?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Есть способ, хотя и более дорогой: выбросить исключение, немедленно поймать его и извлечь первую запись из его трассировки стека. См. Пример здесь о том, как анализировать трассировку. Тот же прием можно использовать и в простой Java (если код скомпилирован с включенной отладочной информацией).
Редактировать: Видимо не все браузеры это поддерживают. Хорошей новостью является (спасибо за комментарий, Кристоф!), Что некоторые браузеры экспортируют имя исходного файла и номер строки непосредственно через свойства fileName и lineNumber объекта ошибки.
Короткий ответ - нет.
Длинный ответ заключается в том, что в зависимости от вашего браузера вы можете генерировать и перехватывать исключение и вытаскивать трассировку стека.
Я подозреваю, что вы используете это для отладки (во всяком случае, я на это надеюсь!), Поэтому лучше всего будет использовать Firebug. Это даст вам объект console; вы можете вызвать console.trace() в любой момент, чтобы посмотреть, что делает ваша программа, не прерывая выполнение.
Есть одно решение.
Обычно __ LINE __ в сочетании с __ FILE __ используется для обозначения местоположений в коде, а маркировка выполняется для поиска этого местоположения позже.
Однако можно добиться того же эффекта, используя глобальные уникальные идентификаторы (GUID) вместо __ LINE __ и __ FILE __. Подробная информация о решении находится в COMMENTS.txt лицензированного BSD набора инструментов, который автоматизирует этот процесс.
Я не понимаю ... вы можете объяснить?
__LINE__ в C расширяется препроцессор, который буквально заменяет его номером строки текущего ввода. Итак, когда вы видите
printf("Line Number: %d\r\n", __LINE__);
компилятор видит:
printf("Line Number: %d\r\n", 324);
Фактически, номер (в данном случае 324) ЗАПИСАН в программе. Это возможно только благодаря механизму двухходовой.
Я не знаю, как это достигается в PHP (он тоже предварительно обрабатывается?).
Да, PHP предварительно обработан. Фактически, это рекурсивная аббревиатура: PHP -> PHP: препроцессор гипертекста. Однако первоначально аббревиатура была для Персональные домашние страницы.
Вы можете попробовать запустить препроцессор C (например, cpp из коллекции компиляторов GNU) для ваших файлов javascript - либо динамически с каждым запросом, либо статически, заставляя эту операцию применяться каждый раз, когда вы меняете файлы javascript. Я думаю, что синтаксис javascript достаточно похож, чтобы это работало.
Тогда у вас будет вся мощь препроцессора C.
Я думаю, что предварительная обработка имеет больше смысла, поскольку она не добавляет накладных расходов времени выполнения. Альтернативой препроцессору C является использование perl, как в двухэтапной процедуре ниже:
1 - добавьте «Строка № 999 \ n» к каждой строке скрипта, которую вы хотите пронумеровать, например,
alert ( "Line # 999 \n"+request.responseText);
2 – run the perl below:
cat my_js.js | perl -ane "{ s/Line # \d+ /Line # $. /; print $_;}" > C_my_js.js; mv C_my_js.js my_js.js
Вы можете использовать это в ванильном JS:
function getLine(offset) {
var stack = new Error().stack.split('\n'),
line = stack[(offset || 1) + 1].split(':');
return parseInt(line[line.length - 2], 10);
}
Object.defineProperty(window, '__LINE__', {
get: function () {
return getLine(2);
}
});
Теперь у вас будет доступ к глобальной переменной __LINE__.
браузеры, которые добавляют трассировку стека к объектам ошибок, также могут напрямую открывать свойство
lineNumber- там нет необходимости в синтаксическом анализе ...