javascript - arguments.le destinataire de l'appel.toString() et des arguments.le destinataire de l'appel.le nom ne renvoie pas le nom de la fonction
Je vais essayer d'obtenir le nom de la fonction courante. De ce que j'ai lu, cela devrait être possible à l'aide de:
(arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/)
Cependant, lorsque je l'exécute dans Firefox et Safari (versions les plus récentes sur Mac) le nom n'est pas retourné.
de la console.log( arguments.le destinataire de l'appel ) renvoie la source de la fonction, mais pas le nom attribué. les arguments.le destinataire de l'appel.nom renvoie une chaîne vide.
Mon exemple de code est comme suit:
var testobj = {
testfunc: function(){
console.log( (arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/) );
}
}
testobj.testfunc();
Puis-je vous demander, pourquoi voulez-vous/besoin de faire cela?
Yah. Donc, je suis en train de travailler sur un projet de compagnie impliquant la fonction de chaînage. J'ai environ 50 différentes fonctions qui s'exécutent tous le même code, sauf qu'une variable donnée est défini comme le même nom de la fonction. Je veux réduire l'ensemble de la duplication d'une seule fonction qui détecte le nom de la fonction appelante et l'utilise comme nom de la variable qui est actuellement codé en dur. Avec cette méthode, je peux définir l'ensemble de mes fonctions dans une seule ligne.
Je dois dire que je suis assez déçu par l'complètement pisse pauvres réponses à cette question, aucun d'entre eux semblent comme ils ont été testés que ce soit
Yah. Donc, je suis en train de travailler sur un projet de compagnie impliquant la fonction de chaînage. J'ai environ 50 différentes fonctions qui s'exécutent tous le même code, sauf qu'une variable donnée est défini comme le même nom de la fonction. Je veux réduire l'ensemble de la duplication d'une seule fonction qui détecte le nom de la fonction appelante et l'utilise comme nom de la variable qui est actuellement codé en dur. Avec cette méthode, je peux définir l'ensemble de mes fonctions dans une seule ligne.
toString()
ing fonctions comme ceci (aka la fonction de "décompilation") a ses verrues. Voir perfectionkills.com/those-tricky-functions, perfectionkills.com/detecting-built-in-host-methods, my.opera.com/hallvors/blog/show.dml/1665828 et my.opera.com/hallvors/blog/2007/07/07/...Je dois dire que je suis assez déçu par l'complètement pisse pauvres réponses à cette question, aucun d'entre eux semblent comme ils ont été testés que ce soit
OriginalL'auteur Geuis | 2009-12-20
Vous devez vous connecter pour publier un commentaire.
Les arguments typiques.le destinataire de l'appel hacks ne fonctionnent pas ici, car ce que vous avez fait est assignée à une fonction anonyme comme la valeur de l'objet 'testfunc la touche. Dans ce cas, le piratage devient encore pire, mais il peut être fait, comme suit:
OriginalL'auteur George Jempty
Vous avez déclaré une fonction anonyme à
Vous devez le déclarer comme
pour obtenir le nom imprimé.
bonne et intéressante à lire.
Pour clarifier les choses: dans le cas d'un style d'objet ci-dessus qui serait
{ testfunc: function testfunc() { ...
. C'est aussi agréable à faire lors du débogage de choses dans le navigateur, à l'aide du débogueur de vous aider à voir de la fonction que vous avez des problèmes.Selon la Wayback Machine, le lien de @TimDown 'commentaire redirige vers kangax.github.com/nfe avant le nom de domaine expiré
OriginalL'auteur Eric Bréchemier
Sur firefox 3.5, Safari 5 et Chrome 6.0, vous pouvez utiliser:
Vous pouvez également obtenir la fonction qui a appelé le courant à l'aide des arguments.le destinataire de l'appel.de l'appelant.
OriginalL'auteur Ben Clayton
Quoi avec la barre oblique inverse avant
[
? Je ne pense pas que vous voulez un littéral crochet ici. Sans que cela devrait fonctionner.Bien que je serais fortement recommandons contre rien à voir avec le sniffing nom de la fonction ou, surtout, en reniflant l'appelant de la fonction. Presque tout ce que vous pourriez faire à l'aide de ces hideux hacks sera mieux fait en utilisant une combinaison de fermetures et de recherches.
OriginalL'auteur bobince
Je pense qu'il y a beaucoup plus propre et élégant solution à tout cela. En supposant que la fonction est un membre d'un objet de niveau supérieur—et c'est toujours le cas, même si la fonction de propriétaire est "fenêtre", ou quelque autre objet global, nous pouvons accéder à l'objet global via le ce mot clé, nous pouvons accéder à la fonction elle-même à l'aide de arguments.le destinataire de l'appel et on peut accéder à tous les parents de l'objet (fonction) les noms à l'aide de for (var o), de sorte que vous devriez être en mesure d'obtenir l'information désirée assez facilement aussi...
Qui doit être robuste et d'éviter tout bizarre navigateur IE comportements accéder à des fonctions nommées, etc.
OriginalL'auteur Murray Todd Williams
OriginalL'auteur yckart
Tout d'abord, la fonction n'ont pas un nom. Le nom de la fonction est ce que vous mettez dans l'entre-deux
function
et les arguments de la liste(...)
. Voici comment obtenir un nom de la fonction (ne pas utiliser lesname
bien, comme il peut être modifié):OriginalL'auteur Eli Grey
J'ai trouvé que si vous connectez-vous simplement que la fonction de l'objet, comme suit:
ou
que vous obtenez tout simplement le nom de la fonction dans le journal de la console avec quelques options.
OriginalL'auteur Dave Van den Eynde