Я использую следующее для получения имени функции вызывающего абонента JavaScript:
var callerFunc = arguments.callee.caller.toString();
callerFuncName = (callerFunc.substring(callerFunc.indexOf("function") + 8, callerFunc.indexOf("(")) || "anoynmous")
Есть ли способ узнать номер строки, из которой был вызван метод?
Кроме того, есть ли способ получить имя файла JavaScript, из которого был вызван метод? Или исходный URL?
javascript
Tal
источник
источник
Ответы:
Это работает для меня в chrome / QtWebView
источник
var caller_line = (new Error).stack.split("\n")[4]
Решение kangax вводит ненужную область видимости try..catch. Если вам нужно получить доступ к номеру строки чего-либо в JavaScript (если вы используете Firefox или Opera), просто откройте
(new Error).lineNumber
.источник
Я был удивлен, что в большинстве этих ответов предполагалось, что вы хотите обработать ошибку, а не просто выводить полезные трассировки отладки для обычных случаев.
Например, мне нравится использовать такую
console.log
обертку:Это заканчивается выводом на мою консоль следующего вида:
1462567104174 [getAllPosts@http://me.com/helper.js:362:9]
См. Https://stackoverflow.com/a/27074218/, а также Правильную оболочку для console.log с правильным номером строки?
источник
Это часто достигается путем выдачи ошибки из текущего контекста; затем анализируя объект ошибки для таких свойств, как
lineNumber
иfileName
(которые есть в некоторых браузерах)Не забывайте, что
callee.caller
свойство устарело (и никогда не упоминалось в 3-м издании ECMA).Также помните, что декомпиляция функции зависит от реализации и может привести к весьма неожиданным результатам. Я писал об этом здесь и здесь .
источник
callee.caller
.line
только при возникновении ошибки.Кажется, я немного опоздал :), но обсуждение довольно интересное, так что ... вот оно ... Предполагая, что вы хотите создать обработчик ошибок, и вы используете свой собственный класс обработчика исключений, например:
И вы обертываете свой код следующим образом:
Скорее всего, у вас будет обработчик ошибок в отдельном файле .js.
Вы заметите, что в консоли ошибок Firefox или Chrome показанный номер строки кода (и имя файла) - это строка (файл), которая выдает исключение «Ошибка», а не исключение «errorHandler», которое вы действительно хотите для выполнения отладки. легко. Создание собственных исключений - это здорово, но в крупных проектах их обнаружение может быть серьезной проблемой, особенно если у них есть похожие сообщения. Итак, что вы можете сделать, так это передать ссылку на фактический пустой объект Error вашему обработчику ошибок, и эта ссылка будет содержать всю необходимую информацию (например, в firefox вы можете получить имя файла, номер строки и т. Д. ; в chrome вы получите нечто подобное, если прочитаете свойство 'stack' экземпляра Error). Короче говоря, вы можете сделать что-то вроде этого:
Теперь вы можете получить фактический файл и номер строки, в которой возникло пользовательское исключение.
источник
Номер строки на самом деле является чем-то статическим, поэтому, если вы просто хотите, чтобы он был записан, его можно предварительно обработать чем-то вроде gulp. Я написал небольшой плагин gulp, который делает именно это:
Это добавит имя файла и строку ко всем журналам из console.log, так
console.log(something)
что станетconsole.log('filePath:fileNumber', something)
. Преимущество состоит в том, что теперь вы можете объединять свои файлы, переносить их ... и вы все равно получите строкуисточник
Я понимаю, что это старый вопрос, но теперь есть метод, называемый
console.trace("Message")
, который покажет вам номер строки и цепочку вызовов методов, которые привели к журналу, вместе с сообщением, которое вы ему передали. Дополнительная информация о трюках с журналированием javascript доступна здесь, на freecodecamp и в этом среднем сообщении в блоге.источник
Если вы хотите знать номер строки для целей отладки или только во время разработки (по какой-либо причине), вы можете использовать Firebug (расширение Firefox) и выбросить исключение.
Редактировать :
Если вам действительно нужно сделать это в производственной среде по какой-либо причине, вы можете предварительно обработать свои файлы javascript, чтобы каждая функция отслеживала строку, в которой она находится. Я знаю некоторые фреймворки, которые используют это покрытие кода (например, JSCoverage ).
Например, предположим, что ваш исходный вызов:
Вы можете написать препроцессор, чтобы превратить его в:
Затем
y()
вы можете использовать,arguments.callee.caller.line
чтобы узнать строку, из которой он был вызван, например:источник
Вот как я это сделал, я тестировал и в Firefox, и в Chrome. Это позволяет проверить имя файла и номер строки места, откуда вызывается функция.
источник
Вот что я написал на основе информации, найденной на этом форуме:
Это часть MyDebugNamespace, Debug, по-видимому, зарезервирован и не будет использоваться в качестве имени пространства имен.
...
...
Как позвонить:
Я включил две функции с переменным количеством аргументов, вызывающих этот базовый код, в свое пространство имен, чтобы при желании опустить сообщение или ошибку в вызовах.
Это отлично работает с Firefox, IE6 и Chrome сообщают, что имя файла и номер строки не определены.
источник
следующий код работает у меня в Mozilla и Chrome.
Его функция журнала, которая показывает имя файла и строку вызывающего абонента.
источник
SyntaxError: function statement requires a name,log: function (arg) {
Мой вклад в пользовательские ошибки в JavaScript:
Во-первых, я согласен с этим парнем из @BT в наследовании от объекта Error - где свойство сообщения? , мы должны построить его правильно (на самом деле вам нужно использовать библиотеку объектов js, моя любимая: https://github.com/jiem/my-class ):
затем мы должны определить глобальную функцию обработки ошибок (необязательно) или они перейдут к движку:
наконец, мы должны тщательно выбросить наши пользовательские ошибки:
Только при передаче третьего параметра как
new Error()
мы можем видеть стек с номерами функций и строк!В 2 функция также может обрабатывать ошибку, выдаваемую движком.
Конечно, реальный вопрос в том, действительно ли это нужно нам и когда; есть случаи (на мой взгляд, 99%), когда достаточно плавного возврата
false
, и остаются только некоторые критические точки, которые нужно показать с выбросом ошибки.Пример: http://jsfiddle.net/centurianii/m2sQ3/1/
источник
Он покажет вам весь трек.
источник
Чтобы определить, в какой строке что-то находится, вам нужно найти во всем коде код, который занимает конкретную интересующую строку, и посчитать символы «\ n» сверху до нужной и добавить 1.
Я действительно делаю это в приложении, которое пишу. Это валидатор передовых практик для HTML, который все еще находится в стадии разработки, но процесс вывода ошибок, который вас может заинтересовать, завершен.
http://mailmarkup.org/htmlint/htmlint.html
источник
Ответы просты. Нет и нет (нет).
К тому времени, когда javascript запустит концепцию исходных файлов / URL-адресов, исходные файлы исчезли.
Также нет способа определить номер строки, потому что снова к моменту выполнения понятие «строки» кода больше не имеет смысла в Javascript.
Конкретные реализации могут предоставлять перехватчики API, позволяющие привилегированному коду получить доступ к таким деталям с целью отладки, но эти API не доступны для обычного стандартного кода Javascript.
источник