function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
Existe uma maneira de descobrir a pilha de chamadas?
javascript
callstack
Ray Lu
fonte
fonte
Respostas:
Observe que esse recurso não é padrão , de
Function.caller
:A seguir está a resposta antiga de 2008, que não é mais suportada no Javascript moderno:
fonte
arguments.callee.caller.name
obterá o nome da função.'use strict';
pode ajudar.arguments
PODE ser acessado de dentro de uma função no modo estrito, seria estúpido depreciar isso. apenas não da função. argumentos do lado de fora. Além disso, se você tiver um argumento nomeado, a forma de argumentos [i] dele não rastreará as alterações feitas na versão nomeada dentro da função.StackTrace
Você pode encontrar todo o rastreamento de pilha usando o código específico do navegador. O bom é que alguém já conseguiu ; Aqui está o código do projeto no GitHub .
Mas nem todas as notícias são boas:
É muito lento para obter o rastreamento da pilha, portanto, tenha cuidado (leia isto para mais).
Você precisará definir os nomes das funções para que o rastreamento da pilha seja legível. Porque se você tiver um código como este:
O Google Chrome alerta,
... kls.Hello ( ...
mas a maioria dos navegadores espera um nome de função logo após a palavra-chavefunction
e o trata como uma função anônima. Nem mesmo o Chrome poderá usar oKlass
nome se você não der o nomekls
à função.E, a propósito, você pode passar para a função printStackTrace a opção,
{guess: true}
mas não encontrei nenhuma melhoria real ao fazer isso.Nem todos os navegadores fornecem as mesmas informações. Ou seja, parâmetros, coluna de código etc.
Nome da Função de Chamador
A propósito, se você deseja apenas o nome da função de chamada (na maioria dos navegadores, mas não no IE), pode usar:
Mas observe que esse nome será o nome da
function
palavra - chave. Não encontrei nenhuma maneira (mesmo no Google Chrome) de obter mais do que isso sem obter o código de toda a função.Código da função de chamada
E resumindo o restante das melhores respostas (de Pablo Cabrera, nourdine e Greg Hewgill). A única coisa que você pode usar em vários navegadores e realmente segura é:
O que mostrará o código da função de chamada. Infelizmente, isso não é suficiente para mim, e é por isso que eu dou dicas para o StackTrace e a função de chamada Name (embora eles não sejam entre navegadores).
fonte
Function.caller
per @ resposta de GregFunction.caller
no entanto, não funcionará no modo estrito.Sei que você mencionou "em Javascript", mas se o objetivo é depurar, acho mais fácil usar as ferramentas de desenvolvedor do seu navegador. É assim que fica no Chrome: basta soltar o depurador no local em que deseja investigar a pilha.
fonte
Para recapitular (e torná-lo mais claro) ...
este código:
é equivalente a isso:
Claramente, o primeiro bit é mais portátil, já que você pode alterar o nome da função, digitar "Hello" para "Ciao" e ainda assim fazer com que tudo funcione.
Neste último caso você decida refatorar o nome da função invocada (Hello), será necessário alterar todas as ocorrências :(
fonte
Você pode obter o stacktrace completo:
Até o chamador estar
null
.Nota: causa um loop infinito em funções recursivas.
fonte
Eu costumo usar
(new Error()).stack
no Chrome. O bom é que isso também fornece os números de linha em que o chamador chamou a função. A desvantagem é que limita o comprimento da pilha a 10, e é por isso que cheguei a esta página em primeiro lugar.(Estou usando isso para coletar pilhas de chamadas em um construtor de baixo nível durante a execução, para exibir e depurar mais tarde, portanto, definir um ponto de interrupção não é útil, pois será atingido milhares de vezes)
fonte
'use strict';
estiver no local. Deu-me as informações de que precisava - obrigado!Se você não for executá-lo no IE <11, o console.trace () será adequado.
fonte
Você pode usar o Function.Caller para obter a função de chamada. O método antigo usando o argumento.caller é considerado obsoleto.
O código a seguir ilustra seu uso:
Notas sobre argument.caller obsoleto: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller
Esteja ciente de que Function.caller não é padrão: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
fonte
Cannot access caller property of a strict mode function
Eu faria isso:
fonte
fonte
arguments.callee.caller.toString()
É mais seguro de usar,
*arguments.callee.caller
poisarguments.caller
está obsoleto ...fonte
arguments.callee
também foi descontinuado no ES5 e removido no modo estrito.arguments.callee
foi uma solução ruim para um problema que agora foi melhor resolvido developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…Parece que esta é uma pergunta bastante resolvida, mas recentemente descobri que o chamado não é permitido no 'modo estrito'; portanto, para meu próprio uso, escrevi uma classe que obterá o caminho de onde é chamada. Faz parte de uma pequena biblioteca auxiliar e, se você quiser usar o código independente, altere o deslocamento usado para retornar o rastreamento de pilha do chamador (use 1 em vez de 2)
fonte
function a(){ function b(){ function c(){ return ScriptPath(); } return c(); } return b(); } a()
no console (não tentei em um arquivo), mas parece ter uma ideia razoável. Deve ser votado de qualquer maneira para ter visibilidade.Tente acessar isso:
fonte
Apenas console registre sua pilha de erros. Você pode saber como está sendo chamado
fonte
Nos modos ES6 e Rigoroso, use o seguinte para obter a função Chamador
Observe que a linha acima lançará uma exceção, se não houver chamador ou pilha anterior. Use de acordo.
fonte
console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
Atualização de 2018
caller
é proibido no modo estrito . Aqui está uma alternativa usando aError
pilha (não padrão) .A função a seguir parece fazer o trabalho no Firefox 52 e no Chrome 61-71, embora sua implementação faça muitas suposições sobre o formato de log dos dois navegadores e deva ser usada com cautela, pois gera uma exceção e possivelmente executa duas regex correspondências antes de serem feitas.
fonte
Eu queria adicionar meu violino aqui para isso:
http://jsfiddle.net/bladnman/EhUm3/
Eu testei isso é chrome, safari e IE (10 e 8). Funciona bem. Há apenas uma função que importa, portanto, se você se assusta com o violino, leia abaixo.
Nota: Há uma boa quantidade do meu próprio "clichê" neste violino. Você pode remover tudo isso e usar divisões, se quiser. É apenas um conjunto "ultra-seguro" de funções nas quais confiei.
Há também um modelo "JSFiddle" que eu uso para muitos violinos para mexer rapidamente.
fonte
String.prototype.trim = trim;
Se você deseja apenas o nome da função e não o código, e deseja uma solução independente do navegador, use o seguinte:
Observe que o descrito acima retornará um erro se não houver função de chamada, pois não há elemento [1] na matriz. Para contornar, use o abaixo:
fonte
Só quero que você saiba que no PhoneGap / Android o
name
parece não estar funcionando. Masarguments.callee.caller.toString()
vai fazer o truque.fonte
Aqui, tudo, exceto o,
functionname
é retiradocaller.toString()
, com o RegExp.fonte
aqui está uma função para obter o stacktrace completo :
fonte
A resposta de heystewart e a resposta de JiarongWu mencionaram que o
Error
objeto tem acesso aostack
.Aqui está um exemplo:
Navegadores diferentes mostram a pilha em diferentes formatos de sequência:
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)
A maioria dos navegadores definirá a pilha com
var stack = (new Error()).stack
. No Internet Explorer, a pilha será indefinida - é necessário lançar uma exceção real para recuperar a pilha.Conclusão: É possível determinar que "principal" é o responsável pela chamada "Olá" usando
stack
oError
objeto De fato, funcionará nos casos em que a abordagemcallee
/caller
não funcionar. Também mostrará o contexto, ou seja, arquivo de origem e número da linha. No entanto, é necessário esforço para tornar a solução entre plataformas.fonte
Observe que você não pode usar o Function.caller no Node.js, use o pacote caller-id . Por exemplo:
fonte
Tente o seguinte código:
Trabalhou para mim no Firefox-21 e Chromium-25.
fonte
arguments.callee
foi descontinuado por muitos anos .Outra maneira de contornar esse problema é simplesmente passar o nome da função de chamada como um parâmetro.
Por exemplo:
Agora, você pode chamar a função assim:
Meu exemplo usa uma verificação codificada do nome da função, mas você pode facilmente usar uma instrução switch ou alguma outra lógica para fazer o que deseja lá.
fonte
Até onde eu sei, temos duas maneiras para isso, de fontes dadas como esta-
argument.caller
Function.caller
Acho que você tem a sua resposta :).
fonte
Por que todas as soluções acima parecem uma ciência de foguetes. Enquanto isso, não deve ser mais complicado que esse trecho. Todos os créditos para esse cara
Como você descobre a função de chamada em JavaScript?
fonte
Estou tentando abordar a questão e a recompensa atual com essa pergunta.
A recompensa requer que o chamador seja obtido no modo estrito , e a única maneira de ver isso é fazendo referência a uma função declarada fora do modo estrito.
Por exemplo, o seguinte não é padrão, mas foi testado nas versões anterior (29/03/2016) e atual (1º de agosto de 2018) do Chrome, Edge e Firefox.
fonte
Se você realmente precisa da funcionalidade por algum motivo e deseja que ela seja compatível com vários navegadores, não se preocupe com coisas estritas e seja compatível com a frente, passe esta referência:
fonte
Acho que o seguinte pedaço de código pode ser útil:
Execute o código:
O log fica assim:
fonte