function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
Existe-t-il un moyen de découvrir la pile d'appels?
javascript
callstack
Ray Lu
la source
la source
Réponses:
Notez que cette fonctionnalité n'est pas standard , à partir de
Function.caller
:Voici l'ancienne réponse de 2008, qui n'est plus prise en charge dans Javascript moderne:
la source
arguments.callee.caller.name
obtiendra le nom de la fonction.'use strict';
pourrait donc être utile.arguments
PEUT être accessible à partir d'une fonction en mode strict, il serait stupide de le déprécier. tout simplement pas de function.arguments de l'extérieur. De plus, si vous avez un argument nommé, sa forme arguments [i] ne suivra pas les modifications que vous apportez à la version nommée dans la fonction.Trace de la pile
Vous pouvez trouver l'intégralité de la trace de la pile à l'aide d'un code spécifique au navigateur. La bonne chose est que quelqu'un l'a déjà fait ; voici le code du projet sur GitHub .
Mais toutes les nouvelles ne sont pas bonnes:
Il est très lent d'obtenir la trace de la pile, alors soyez prudent (lisez ceci pour en savoir plus).
Vous devrez définir des noms de fonction pour que la trace de pile soit lisible. Parce que si vous avez un code comme celui-ci:
Google Chrome alertera
... kls.Hello ( ...
mais la plupart des navigateurs s'attendront à un nom de fonction juste après le mot-cléfunction
et le traiteront comme une fonction anonyme. Un même Chrome ne pourra pas utiliser leKlass
nom si vous ne donnez pas le nomkls
à la fonction.Et au fait, vous pouvez passer à la fonction printStackTrace l'option
{guess: true}
mais je n'ai trouvé aucune amélioration réelle en faisant cela.Tous les navigateurs ne vous donnent pas les mêmes informations. Autrement dit, les paramètres, la colonne de code, etc.
Nom de la fonction de l'appelant
Soit dit en passant, si vous ne voulez que le nom de la fonction appelant (dans la plupart des navigateurs, mais pas IE), vous pouvez utiliser:
Mais notez que ce nom sera celui après le
function
mot - clé. Je n'ai trouvé aucun moyen (même sur Google Chrome) d'obtenir plus que cela sans obtenir le code de la fonction entière.Code de fonction de l'appelant
Et résumant le reste des meilleures réponses (par Pablo Cabrera, nourdine et Greg Hewgill). La seule chose multi-navigateur et vraiment sûre que vous pouvez utiliser est:
Qui affichera le code de la fonction appelant. Malheureusement, cela ne me suffit pas, et c'est pourquoi je vous donne des conseils pour le StackTrace et le nom de la fonction d'appel (bien qu'ils ne soient pas multi-navigateurs).
la source
Function.caller
selon la réponse de @ GregFunction.caller
ne fonctionnera pas en mode strict, cependant.Je sais que vous avez mentionné "en Javascript", mais si le but est le débogage, je pense qu'il est plus facile d'utiliser simplement les outils de développement de votre navigateur. Voici à quoi cela ressemble dans Chrome: déposez simplement le débogueur à l'endroit où vous souhaitez enquêter sur la pile.
la source
Pour récapituler (et le rendre plus clair) ...
ce code:
est équivalent à ceci:
De toute évidence, le premier bit est plus portable, car vous pouvez changer le nom de la fonction, par exemple de "Bonjour" à "Ciao", et toujours faire fonctionner le tout.
Dans ce dernier cas, si vous décidez de refactoriser le nom de la fonction invoquée (Bonjour), vous devrez modifier toutes ses occurrences :(
la source
Vous pouvez obtenir la trace de pile complète:
Jusqu'à ce que l'appelant soit
null
.Remarque: cela provoque une boucle infinie sur les fonctions récursives.
la source
J'utilise habituellement
(new Error()).stack
dans Chrome. La bonne chose est que cela vous donne également les numéros de ligne où l'appelant a appelé la fonction. L'inconvénient est qu'il limite la longueur de la pile à 10, c'est pourquoi je suis venu sur cette page en premier lieu.(J'utilise cela pour collecter des piles d'appels dans un constructeur de bas niveau pendant l'exécution, pour afficher et déboguer plus tard, donc la définition d'un point d'arrêt n'est pas utile car il sera atteint des milliers de fois)
la source
'use strict';
en place. M'a donné les informations dont j'avais besoin - merci!Si vous n'allez pas l'exécuter dans IE <11, alors console.trace () conviendrait.
la source
Vous pouvez utiliser Function.Caller pour obtenir la fonction appelante. L'ancienne méthode utilisant argument.caller est considérée comme obsolète.
Le code suivant illustre son utilisation:
Notes sur l'argument.caller obsolète: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller
Soyez conscient que Function.caller n'est pas standard: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
la source
Cannot access caller property of a strict mode function
Je ferais ceci:
la source
la source
arguments.callee.caller.toString()
Il est plus sûr à utiliser
*arguments.callee.caller
car ilarguments.caller
est obsolète ...la source
arguments.callee
est également déconseillé dans ES5 et supprimé en mode strict.arguments.callee
était une mauvaise solution à un problème qui a maintenant été mieux résolu developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…On dirait que c'est une question assez résolue, mais j'ai récemment découvert que l' appelé n'est pas autorisé en «mode strict», donc pour mon propre usage, j'ai écrit une classe qui obtiendra le chemin d'où elle s'appelle. Cela fait partie d'une petite bibliothèque d'aide et si vous souhaitez utiliser le code de manière autonome, changez l'offset utilisé pour renvoyer la trace de pile de l'appelant (utilisez 1 au lieu de 2)
la source
function a(){ function b(){ function c(){ return ScriptPath(); } return c(); } return b(); } a()
dans la console (je n'ai pas essayé dans un fichier), mais semble avoir une idée raisonnable. Doit être voté de toute façon pour la visibilité.Essayez d'accéder à ceci:
la source
Consignez simplement votre console dans la pile des erreurs. Vous pouvez alors savoir comment vous appelez
la source
En mode ES6 et strict, utilisez ce qui suit pour obtenir la fonction Appelant
Veuillez noter que la ligne ci-dessus lèvera une exception s'il n'y a aucun appelant ou aucune pile précédente. Utilisez en conséquence.
la source
console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
Mise à jour 2018
caller
est interdit en mode strict . Voici une alternative utilisant la pile (non standard)Error
.La fonction suivante semble faire le travail dans Firefox 52 et Chrome 61-71 bien que son implémentation fasse beaucoup d'hypothèses sur le format de journalisation des deux navigateurs et doit être utilisée avec prudence, car elle lève une exception et exécute éventuellement deux expressions régulières appariements avant d'être fait.
la source
Je voulais ajouter mon violon ici pour cela:
http://jsfiddle.net/bladnman/EhUm3/
J'ai testé c'est chrome, safari et IE (10 et 8). Fonctionne bien. Il n'y a qu'une seule fonction qui compte, donc si vous avez peur du gros violon, lisez ci-dessous.
Remarque: il y a une bonne quantité de mon propre "passe-partout" dans ce violon. Vous pouvez supprimer tout cela et utiliser des scissions si vous le souhaitez. C'est juste un ensemble de fonctions ultra-sûres sur lesquelles je viens de compter.
Il y a aussi un modèle "JSFiddle" que j'utilise pour de nombreux violons pour un simple violon rapide.
la source
String.prototype.trim = trim;
Si vous souhaitez simplement le nom de la fonction et non le code, et souhaitez une solution indépendante du navigateur, utilisez ce qui suit:
Notez que ce qui précède retournera une erreur s'il n'y a pas de fonction d'appelant car il n'y a pas d'élément [1] dans le tableau. Pour contourner ce problème, utilisez ce qui suit:
la source
Je veux juste vous faire savoir que sur PhoneGap / Android du
name
doesnt semblent fonctionner. Maisarguments.callee.caller.toString()
fera l'affaire.la source
Ici, tout sauf le
functionname
est supprimécaller.toString()
, avec RegExp.la source
voici une fonction pour obtenir le stacktrace complet :
la source
La réponse de heystewart et la réponse de JiarongWu ont toutes deux mentionné que l'
Error
objet a accès à lastack
.Voici un exemple:
Différents navigateurs affichent la pile dans différents formats de chaîne:
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)
La plupart des navigateurs définiront la pile avec
var stack = (new Error()).stack
. Dans Internet Explorer, la pile ne sera pas définie - vous devez lever une véritable exception pour récupérer la pile.Conclusion: Il est possible de déterminer "principal" est l'appelant à "Bonjour" en utilisant le
stack
dans l'Error
objet. En fait, cela fonctionnera dans les cas où l' approchecallee
/caller
ne fonctionne pas. Il vous montrera également le contexte, c'est-à-dire le fichier source et le numéro de ligne. Cependant, des efforts sont nécessaires pour rendre la solution multiplateforme.la source
Notez que vous ne pouvez pas utiliser Function.caller dans Node.js, utilisez plutôt le package id-appelant . Par exemple:
la source
Essayez le code suivant:
A travaillé pour moi dans Firefox-21 et Chromium-25.
la source
arguments.callee
est obsolète depuis de nombreuses années .Une autre façon de contourner ce problème consiste à simplement passer le nom de la fonction appelante en tant que paramètre.
Par exemple:
Maintenant, vous pouvez appeler la fonction comme ceci:
Mon exemple utilise une vérification codée en dur du nom de la fonction, mais vous pouvez facilement utiliser une instruction switch ou une autre logique pour faire ce que vous voulez.
la source
Pour autant que je sache, nous avons 2 voies pour cela à partir de sources données comme celle-ci-
arguments.caller
Function.caller
Pensez que vous avez votre réponse :).
la source
Pourquoi toutes les solutions ci-dessus ressemblent à une science de fusée. En attendant, cela ne devrait pas être plus compliqué que cet extrait. Tous les crédits à ce gars
Comment découvrir la fonction appelant en JavaScript?
la source
J'essaie de répondre à la fois à la question et à la prime actuelle avec cette question.
La prime nécessite que l'appelant soit obtenu en mode strict , et la seule façon dont je peux voir cela est de se référer à une fonction déclarée en dehors du mode strict.
Par exemple, ce qui suit n'est pas standard mais a été testé avec les versions précédentes (29/03/2016) et actuelles (1er août 2018) de Chrome, Edge et Firefox.
la source
Si vous avez vraiment besoin de la fonctionnalité pour une raison quelconque et que vous souhaitez qu'elle soit compatible avec tous les navigateurs et ne vous inquiétez pas pour les choses strictes et la compatibilité ascendante, passez une référence:
la source
Je pense que le morceau de code suivant peut être utile:
Exécutez le code:
Le journal ressemble à ceci:
la source