__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