Эквивалент __LINE__ в Javascript

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
15
0
7 077
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Есть способ, хотя и более дорогой: выбросить исключение, немедленно поймать его и извлечь первую запись из его трассировки стека. См. Пример здесь о том, как анализировать трассировку. Тот же прием можно использовать и в простой Java (если код скомпилирован с включенной отладочной информацией).

Редактировать: Видимо не все браузеры это поддерживают. Хорошей новостью является (спасибо за комментарий, Кристоф!), Что некоторые браузеры экспортируют имя исходного файла и номер строки непосредственно через свойства fileName и lineNumber объекта ошибки.

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

Christoph 18.01.2009 13:49

Короткий ответ - нет.

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

Я подозреваю, что вы используете это для отладки (во всяком случае, я на это надеюсь!), Поэтому лучше всего будет использовать Firebug. Это даст вам объект console; вы можете вызвать console.trace() в любой момент, чтобы посмотреть, что делает ваша программа, не прерывая выполнение.

Есть одно решение.

Обычно __ LINE __ в сочетании с __ FILE __ используется для обозначения местоположений в коде, а маркировка выполняется для поиска этого местоположения позже.

Однако можно добиться того же эффекта, используя глобальные уникальные идентификаторы (GUID) вместо __ LINE __ и __ FILE __. Подробная информация о решении находится в COMMENTS.txt лицензированного BSD набора инструментов, который автоматизирует этот процесс.

Я не понимаю ... вы можете объяснить?

Jason 21.06.2012 07:34

__LINE__ в C расширяется препроцессор, который буквально заменяет его номером строки текущего ввода. Итак, когда вы видите

printf("Line Number: %d\r\n", __LINE__);

компилятор видит:

printf("Line Number: %d\r\n", 324);

Фактически, номер (в данном случае 324) ЗАПИСАН в программе. Это возможно только благодаря механизму двухходовой.

Я не знаю, как это достигается в PHP (он тоже предварительно обрабатывается?).

Да, PHP предварительно обработан. Фактически, это рекурсивная аббревиатура: PHP -> PHP: препроцессор гипертекста. Однако первоначально аббревиатура была для Персональные домашние страницы.

alex 19.02.2010 08:53

Вы можете попробовать запустить препроцессор 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__.

Другие вопросы по теме