function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
Есть ли способ узнать стек вызовов?
javascript
callstack
Рэй Лу
источник
источник
Ответы:
Обратите внимание, что эта функция является нестандартной , из
Function.caller
:Ниже приводится старый ответ 2008 года, который больше не поддерживается в современном Javascript:
источник
arguments.callee.caller.name
получит имя функции.'use strict';
может помочь.arguments
МОЖЕТ быть доступным изнутри функции в строгом режиме, было бы глупо отрицать это. просто не из функции. аргументы извне. Кроме того, если у вас есть именованный аргумент, форма arguments [i] не будет отслеживать изменения, которые вы вносите в именованную версию внутри функции.Трассировки стека
Вы можете найти всю трассировку стека, используя специфический для браузера код. Хорошо, что кто-то уже сделал это ; Вот код проекта на GitHub .
Но не все новости хорошие
Очень медленно получить трассировку стека, поэтому будьте осторожны (читайте это подробнее).
Вам нужно будет определить имена функций для трассировки стека, чтобы они были разборчивыми. Потому что, если у вас есть такой код:
Google Chrome выдаст предупреждение,
... kls.Hello ( ...
но большинство браузеров будут ожидать имя функции сразу после ключевого словаfunction
и будут рассматривать его как анонимную функцию. Даже Chrome не сможет использоватьKlass
имя, если вы не дадите имяkls
функции.И, кстати, вы можете передать функции printStackTrace эту опцию,
{guess: true}
но я не нашел никакого реального улучшения, сделав это.Не все браузеры дают вам одинаковую информацию. То есть параметры, столбец кода и т. Д.
Имя функции вызывающей стороны
Кстати, если вам нужно только имя функции вызывающей стороны (в большинстве браузеров, но не в IE), вы можете использовать:
Но обратите внимание, что это имя будет одним после
function
ключевого слова. Я не нашел способа (даже в Google Chrome) получить больше, чем без кода всей функции.Код функции звонящего по телефону
И резюмируя остальные лучшие ответы (Пабло Кабрера, Нурдин и Грег Хьюгилл). Единственная кросс-браузерная и действительно безопасная вещь, которую вы можете использовать:
Который покажет код функции звонящего. К сожалению, этого недостаточно для меня, и именно поэтому я даю вам подсказки для StackTrace и функции вызывающей стороны Name (хотя они не являются кросс-браузерными).
источник
Function.caller
в ответ @ ГрегFunction.caller
однако не будет работать в строгом режиме.Я знаю, что вы упомянули "в Javascript", но если целью является отладка, я думаю, что проще использовать инструменты разработчика вашего браузера. Вот как это выглядит в Chrome: просто бросьте отладчик, где вы хотите исследовать стек.
источник
Подведем итоги (и проясним)
этот код:
эквивалентно этому:
Очевидно, что первый бит более переносим, поскольку вы можете изменить имя функции, скажем, с «Hello» на «Ciao», и все же заставить все это работать.
В последнем случае, если вы решите провести рефакторинг имени вызываемой функции (Hello), вам придется изменить все ее вхождения :(
источник
Вы можете получить полную трассировку стека:
Пока звонилка есть
null
.Примечание: это вызывает бесконечный цикл на рекурсивных функциях.
источник
Я обычно использую
(new Error()).stack
в Chrome. Приятно то, что это также дает вам номера строк, где вызывающая сторона вызывала функцию. Недостатком является то, что он ограничивает длину стека до 10, поэтому я пришел на эту страницу в первую очередь.(Я использую это для сбора callstacks в низкоуровневом конструкторе во время выполнения, для просмотра и отладки позже, поэтому установка точки останова не используется, так как она будет срабатывать тысячи раз)
источник
'use strict';
на месте. Дали мне информацию, в которой я нуждался - спасибо!Если вы не собираетесь запускать его в IE <11, тогда будет подходить console.trace () .
источник
Вы можете использовать Function.Caller, чтобы получить вызывающую функцию. Старый метод, использующий аргумент arguments.caller, считается устаревшим.
Следующий код иллюстрирует его использование:
Заметки об устаревшем аргументе. Caller : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller
Помните, что Function.caller нестандартный: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
источник
Cannot access caller property of a strict mode function
Я бы сделал это:
источник
источник
arguments.callee.caller.toString()
Это безопаснее в использовании,
*arguments.callee.caller
такarguments.caller
как устарела ...источник
arguments.callee
также устарела в ES5 и удалена в строгом режиме.arguments.callee
было плохим решением проблемы, которая теперь лучше решена developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Похоже, это довольно решенный вопрос, но недавно я обнаружил, что вызываемый объект не допускается в «строгом режиме», поэтому для собственного использования я написал класс, который будет получать путь от места его вызова. Это часть небольшой вспомогательной библиотеки, и если вы хотите использовать автономный код, измените смещение, используемое для возврата трассировки стека вызывающей стороны (используйте 1 вместо 2)
источник
function a(){ function b(){ function c(){ return ScriptPath(); } return c(); } return b(); } a()
в консоли (не пробовал в файле), но, похоже, есть разумная идея. В любом случае следует проголосовать за видимость.Попробуйте получить доступ к этому:
источник
Просто консоль журнала вашей ошибки стека. Вы можете узнать, как вас зовут
источник
И в ES6, и в строгом режиме используйте следующую функцию, чтобы получить функцию Caller.
Обратите внимание, что в приведенной выше строке будет сгенерировано исключение, если нет вызывающей стороны или нет предыдущего стека. Используйте соответственно.
источник
console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
2018 Обновление
caller
запрещено в строгом режиме . Вот альтернатива, использующая (нестандартный)Error
стек .Следующая функция, кажется, делает работу в Firefox 52 и Chrome 61-71, хотя ее реализация делает много предположений о формате ведения журнала двух браузеров и должна использоваться с осторожностью, учитывая, что она выдает исключение и, возможно, выполняет два регулярных выражения соответствия, прежде чем быть сделано.
источник
Я хотел добавить свою скрипку здесь для этого:
http://jsfiddle.net/bladnman/EhUm3/
Я проверял это хром, сафари и IE (10 и 8). Работает отлично. Имеет значение только 1 функция, поэтому, если вас пугает большая скрипка, читайте ниже.
Примечание: в этой скрипке довольно много моих собственных "шаблонов". Вы можете удалить все это и использовать сплит, если хотите. Это просто ультра-безопасный »набор функций, на которые я полагаюсь.
Там также есть шаблон "JSFiddle", который я использую для многих скрипок, чтобы просто быстро поиграть.
источник
String.prototype.trim = trim;
Если вам просто нужно имя функции, а не код, и вы хотите независимое от браузера решение, используйте следующее:
Обратите внимание, что приведенное выше вернет ошибку, если нет функции вызывающей стороны, поскольку в массиве нет элемента [1]. Чтобы обойти, используйте ниже:
источник
Просто хочу , чтобы вы знали , что на PhoneGap / Android
name
, кажется, работает оленья кожа. Ноarguments.callee.caller.toString()
сделаем свое дело.источник
Здесь все , но
functionname
удаляется изcaller.toString()
, с RegExp.источник
вот функция для получения полной трассировки стека :
источник
Ответ heystewart в и ответ JiarongWu в обоих упоминается , что
Error
объект имеет доступ кstack
.Вот пример:
Разные браузеры показывают стек в разных форматах строки:
Safari : Caller is: main@https://stacksnippets.net/js:14:8 Firefox : Caller is: main@https://stacksnippets.net/js:14:3 Chrome : Caller is: at main (https://stacksnippets.net/js:14:3) IE Edge : Caller is: at main (https://stacksnippets.net/js:14:3) IE : Caller is: at main (https://stacksnippets.net/js:14:3)
Большинство браузеров устанавливают стек с
var stack = (new Error()).stack
. В Internet Explorer стек не определен - вам нужно создать реальное исключение для извлечения стека.Вывод: можно определить, что "main" является вызывающей стороной "Hello", используя объект
stack
inError
. На самом деле это будет работать в тех случаях, когдаcallee
/caller
подход не работает. Он также покажет вам контекст, то есть исходный файл и номер строки. Однако необходимо приложить усилия, чтобы сделать решение кроссплатформенным.источник
Обратите внимание, что вы не можете использовать Function.caller в Node.js, вместо этого используйте пакет caller-id . Например:
источник
Попробуйте следующий код:
У меня работали в Firefox-21 и Chromium-25.
источник
arguments.callee
был осужден в течение многих лет .Другой способ обойти эту проблему - просто передать имя вызывающей функции в качестве параметра.
Например:
Теперь вы можете вызвать функцию следующим образом:
В моем примере используется жестко закодированная проверка имени функции, но вы можете легко использовать оператор switch или какую-то другую логику, чтобы делать то, что вы хотите.
источник
Насколько я знаю, у нас есть два пути для этого из данных источников, как это
arguments.caller
Function.caller
Думаю, у тебя есть ответ :).
источник
Почему все приведенные выше решения выглядят как ракетостроение. Между тем, это не должно быть сложнее, чем этот фрагмент. Все кредиты этому парню
Как вы узнаете функцию вызова в JavaScript?
источник
Я пытаюсь ответить и на этот вопрос, и на текущую награду.
Щедрость требует, чтобы вызывающий был получен в строгом режиме, и единственный способ увидеть это - обратиться к функции, объявленной вне строгого режима.
Например, следующее является нестандартным, но было протестировано с предыдущими (29/03/2016) и текущими (1 августа 2018 года) версиями Chrome, Edge и Firefox.
источник
Если вам действительно нужна функциональность по какой-то причине и вы хотите, чтобы она была совместима с разными браузерами, не беспокоились о строгих вещах и были совместимы с прямой версией, передайте следующую ссылку:
источник
Я думаю, что следующий фрагмент кода может быть полезным:
Выполните код:
Журнал выглядит так:
источник