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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

По сути, число (324 в этом случае) HARDCODED в программе. Именно этот двухпроходный механизм делает это возможным.

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

Ответ 4

Вы можете попробовать запустить препроцессор C (f.e. cpp из коллекции компиляторов GNU) в ваших файлах javascript - либо динамически с каждым запросом, либо статически, делая эту операцию примененной каждый раз, когда вы меняете файлы javascript. Я думаю, что синтаксис javascript достаточно схож, чтобы это работало.

Тогда у вас будет все возможности препроцессора C.

Ответ 5

Существует одно обходное решение.

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

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

Ответ 6

Я думаю, что предварительная обработка имеет больше смысла, поскольку она не добавляет лишних затрат времени исполнения. Альтернативой препроцессору C является использование perl, как в двухэтапной процедуре ниже:

1 - добавьте строку "999\n" в каждую строку в script, которую вы хотите пронумеровать, например

  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