1029 votes

Comment trouvez-vous l'appelant de la fonction en JavaScript?

function main()
{
   Hello();
}

function Hello()
{
  // How do you find out the caller function is 'main'?
}

Est-il un moyen de trouver la pile d'appel?

1068voto

Greg Hewgill Points 356191
function Hello()
{
    alert("caller is " + arguments.callee.caller.toString());
}

165voto

Protron Points 3889

StackTrace

Vous pouvez trouver l'ensemble de la trace de la pile à l'aide du navigateur de code spécifique. La bonne chose est que quelqu'un l'a déjà fait; ici, c'est le projet de code sur GitHub.

Mais pas tous, les nouvelles sont bonnes:

  1. Il est vraiment lent pour la trace de la pile, donc soyez prudent (lire ceci pour plus de détails).

  2. Vous aurez besoin de définir des noms de fonction pour la trace de la pile pour être lisible. Parce que si vous avez un code comme ceci:

    var Klass = function kls() {
       this.Hello = function() { alert(printStackTrace().join('\n\n')); };
    }
    new Klass().Hello();
    

    Google Chrome alerte ... kls.Hello ( ... , mais la plupart des navigateurs de s'attendre à un nom de fonction juste après le mot-clé function et la traiter comme une fonction anonyme. Un pas même le Chrome sera en mesure d'utiliser l' Klass nom si vous ne donnez pas le nom de l' kls à la fonction.

    Et par la manière, vous pouvez passer à la fonction printStackTrace l'option {guess: true} mais je n'ai pas trouvé une réelle amélioration en faisant cela.

  3. Pas tous les navigateurs vous donnent la même information. C'est, paramètres, le code de la colonne, etc.


De L'Appelant Nom De La Fonction

Par ailleurs, si vous voulez seulement le nom de l'appelant la fonction (dans la plupart des navigateurs, mais pas IE), vous pouvez utiliser:

arguments.callee.caller.name

Mais notez que ce nom sera l'un après l' function mot-clé. Je n'ai trouvé aucune façon (même sur Google Chrome) pour obtenir de plus sans obtenir le code de la fonction entière.


Appelant La Fonction Code

Et de résumer le reste de la meilleure des réponses (par Pablo Cabrera, nourdine, et Greg Hewgill). La seule croix-navigateur et vraiment sûr que vous pouvez utiliser est:

arguments.callee.caller.toString();

Qui va montrer le code de l'appelant la fonction. Malheureusement, ce n'est pas assez pour moi, et c'est pourquoi je vous donner des conseils pour le suivi de pile et de l'appelant Nom de la fonction (bien qu'ils ne sont pas cross-browser).

53voto

ale5000 Points 199

Vous pouvez obtenir le plein stacktrace:

arguments.callee.caller
arguments.callee.caller.caller
arguments.callee.caller.caller.caller

Jusqu'à ce que l'appelant est - null.

52voto

nourdine Points 1086

pour résumer (et le rendre plus clair) ...

ce code:

function Hello() {
    alert("caller is " + arguments.callee.caller.toString());
}

est équivalent à ceci:

function Hello() {
    alert("caller is " + Hello.caller.toString());
}

clairement, le premier bit est plus portable puisque vous pouvez changer le nom de la fonction, de dire "Salut" à "Ciao", et encore obtenir le tout pour le travail. Dans le second, dans le cas où u décider de refactoriser le nom de la fonction invoquée (Bonjour), vous devrez modifier tous ses occurencies :(

19voto

Pablo Cabrera Points 3245

Il est plus sûr d'utiliser des *arguments.callee.caller depuis arguments.caller est obsolète...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X