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?
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?
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:
Il est vraiment lent pour la trace de la pile, donc soyez prudent (lire ceci pour plus de détails).
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.
Pas tous les navigateurs vous donnent la même information. C'est, paramètres, le code de la colonne, etc.
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.
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).
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 :(
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.