Comment puis-je accéder à un nom de fonction depuis l'intérieur de cette fonction?
// parasitic inheritance
var ns.parent.child = function() {
var parent = new ns.parent();
parent.newFunc = function() {
}
return parent;
}
var ns.parent = function() {
// at this point, i want to know who the child is that called the parent
// ie
}
var obj = new ns.parent.child();
javascript
function
Scott Klarenbach
la source
la source
Réponses:
Dans ES5, la meilleure chose à faire est de:
L'utilisation
Function.caller
n'est pas standard.Function.caller
etarguments.callee
sont tous deux interdits en mode strict.Edit: la réponse basée sur l'expression rationnelle de nus ci-dessous réalise la même chose, mais a de meilleures performances!
Dans ES6, vous pouvez simplement utiliser
myFunction.name
.Remarque: Attention, certains minificateurs JS peuvent jeter les noms de fonction pour mieux compresser; vous devrez peut-être modifier leurs paramètres pour éviter cela.
la source
fun.toString().substr(0, 100)
qui pour mes besoins suffira pour localiser la fonction en question. Alors, merci pour l'inspiration!myFunction.name
est la meilleure chose à faire dans ES6.myFunction.name
ça sert si vous tapez le nom de la fonction? défait le but des variables magiques.arr[index].name
cela fonctionnera aussi :)myFunction.name
sera également mise à jour. Bien sûr, intelliJ prend en charge le changement de nom des identifiants dans les chaînes, mais cela fonctionne beaucoup moins régulièrement et deviendra silencieusement obsolète si quelqu'un oublie de cocher l'option "Rechercher dans les chaînes".myFunction.name
est un choix légèrement meilleur que le codage en dur de la chaîne.ES6 (inspiré par la réponse de sendy halim ci-dessous):
Explication sur MDN . À partir de 2015, fonctionne dans nodejs et tous les principaux navigateurs, sauf IE.
Remarque: Sur les fonctions liées, cela donnera "
bound <originalName>
". Vous devrez supprimer la "borne" si vous souhaitez obtenir le nom d'origine.ES5 (inspiré par la réponse de Vlad):
Si vous avez une référence à la fonction, vous pouvez faire:
caller
etcallee
sont considérés comme obsolètes.[1] Je l'inclus ici car il est légal et souvent les outils de mise en évidence de la syntaxe ne prennent pas en compte l'espace blanc entre le nom de la fonction et la parenthèse. D'un autre côté, je ne connais aucune implémentation de .toString () qui inclura des espaces blancs ici, c'est pourquoi vous pouvez l'omettre.
En réponse à la question d'origine, je supprimerais l'héritage parasite et opterais pour des modèles de conception OOP plus traditionnels. J'ai écrit un TidBits.OoJs pour écrire confortablement du code OOP en JavaScript avec un ensemble de fonctionnalités imitant le C ++ (pas encore terminé, mais surtout).
Je vois dans les commentaires que vous souhaitez éviter de transmettre les
parent
besoins d' informations à son constructeur. Je dois admettre que les modèles de conception traditionnels ne vous sauveront pas de celui-ci, car il est généralement considéré comme une bonne chose de rendre vos dépendances évidentes et appliquées.Je suggère également de s'éloigner des fonctions anonymes. Ils ne font que le débogage et le profilage d'un PITA parce que tout apparaît simplement comme une "fonction anonyme", et il n'y a aucun avantage pour eux que je sache.
la source
.name
propriété d' une méthode de composant apparaissait comme la chaîne "valeur", quel que soit son nom. Curieusement, lors des tests dans l'application expo, cela allait, cependant, une fois compilé dans une application réelle, il se bloquait silencieusement.vous attribuez une fonction sans nom à une variable. vous aurez probablement besoin d'une expression de fonction nommée à la place ( http://kangax.github.com/nfe/ ).
mais je ne sais pas combien de cross-browser c'est; il y a un problème avec IE6 qui vous fait fuir le nom de la fonction vers la portée externe. aussi, arguments.callee est un peu obsolète et entraînera une erreur si vous utilisez
strict mode
.la source
Any
constructor
expose une propriéténame
, qui est le nom de la fonction. Vous accédez àconstructor
via une instance (en utilisantnew
) ou unprototype
:la source
console.log
journal des appelswindow
ouObject
pour moi en fonction de l'endroit où je l'exécute, nonPerson
.Cela ressemble à la chose la plus stupide que j'ai écrite de ma vie, mais c'est drôle: D
d
- profondeur de pile.0
- retourner ce nom de fonction,1
- parent, etc .;[0 + d]
- juste pour comprendre - ce qui se passe;firefoxMatch
- fonctionne pour le safari, mais j'avais vraiment un peu de temps pour les tests, car le propriétaire de mac était revenu après avoir fumé et m'a chassé: '(Essai:
Résultat:
Chrome:
Fitefox:
Cette solution ne créait que pour le plaisir ! Ne l'utilisez pas pour de vrais projets. Cela ne dépend pas de la spécification ES, cela ne dépend que de la réalisation du navigateur. Après la prochaine mise à jour de chrome / firefox / safari, il peut être cassé.
De plus, il n'y a pas de traitement d'erreur (ha) - si la
d
longueur de la pile est supérieure - vous obtiendrez une erreur;Pour les autres modèles de messages d'erreur de wrowsers - vous obtiendrez une erreur;
Cela doit fonctionner pour les classes ES6 (
.split('.').pop()
), mais vous pouvez obtenir une erreur;la source
Cela pourrait fonctionner pour vous:
l'exécution de foo () affichera "foo" ou indéfini si vous appelez à partir d'une fonction anonyme.
Il fonctionne également avec les constructeurs, auquel cas il afficherait le nom du constructeur appelant (par exemple "Foo").
Plus d'informations ici: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller
Ils affirment que ce n'est pas standard, mais aussi qu'il est pris en charge par tous les principaux navigateurs: Firefox, Safari, Chrome, Opera et IE.
la source
Tu ne peux pas. Les fonctions n'ont pas de noms selon la norme (bien que mozilla ait un tel attribut) - elles ne peuvent être attribuées qu'à des variables avec des noms.
Aussi votre commentaire:
est à l'intérieur de la fonction my.namespace.myFunc.getFn
Ce que vous pouvez faire est de renvoyer le constructeur d'un objet créé par new
Vous pourriez donc dire
la source
Vous pouvez l'utiliser pour les navigateurs qui prennent en charge Error.stack (pas presque tous, probablement)
bien sûr, c'est pour la fonction actuelle, mais vous avez l'idée.
heureux de baver pendant que vous codez
la source
Vous pouvez utiliser la
name
propriété pour obtenir le nom de la fonction, sauf si vous utilisez une fonction anonymePar exemple:
essayons maintenant avec la fonction nommée
maintenant vous pouvez utiliser
la source
Vous pouvez utiliser le nom du constructeur comme:
ce code renvoie simplement le nom d'une méthode.
la source
dans la mesure où
ECMAScript 6
vous pouvez utiliser la méthode Function.namela source
Vous pouvez utiliser
Function.name
:Dans la plupart des implémentations de JavaScript, une fois que vous avez la référence de votre constructeur dans la portée, vous pouvez obtenir son nom de chaîne à partir de sa propriété name (par exemple Function.name ou Object.constructor.name
Vous pouvez utiliser
Function.callee
:La
arguments.caller
méthode native a été déconseillée, mais la plupart des navigateurs prennent en chargeFunction.caller
, qui renverra l'objet invoquant réel (son corps de code): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ Fonction / appelant? Redirectlocale = en-US & redirectslug = JavaScript% 2FReference% 2FGlobal_Objects% 2FFunction% 2FcallerVous pouvez créer une carte source :
Si vous avez besoin de la signature de la fonction littérale (le "nom" de celle-ci) et non de l'objet lui-même, vous devrez peut-être recourir à quelque chose d'un peu plus personnalisé, comme la création d'une référence de tableau des valeurs de chaîne API que vous devrez accéder fréquemment. Vous pouvez les mapper ensemble à l'aide de
Object.keys()
votre tableau de chaînes, ou consulter la bibliothèque de cartes sources de Mozilla sur GitHub, pour des projets plus importants: https://github.com/mozilla/source-mapla source
Je sais que c'est une vieille question, mais récemment j'ai rencontré un problème similaire en essayant de décorer certaines méthodes de React Component, à des fins de débogage. Comme les gens l'ont déjà dit,
arguments.caller
etarguments.callee
sont interdits en mode strict qui est probablement activé par défaut dans votre transpilage React. Vous pouvez le désactiver, ou j'ai pu trouver un autre hack, car dans React toutes les fonctions de classe sont nommées, vous pouvez réellement faire ceci:la source
Cela a fonctionné pour moi.
Code de test:
la source
J'ai eu un problème similaire et je l'ai résolu comme suit:
Ce code implémente, d'une manière plus confortable, une réponse que j'ai déjà lue ici en haut de cette discussion. Maintenant, j'ai une fonction membre qui récupère le nom de n'importe quel objet fonction. Voici le script complet ...
la source
Si j'ai compris ce que vous vouliez faire, c'est ce que je fais à l'intérieur d'un constructeur de fonctions.
la source
Cela fonctionnera dans ES5, ES6, tous les navigateurs et les fonctions en mode strict.
Voici à quoi cela ressemble avec une fonction nommée.
Voici à quoi cela ressemble avec une fonction anonyme.
la source
at myName (<anonymous>:2:15)
Firefox:@debugger eval code:3:3
regardez ici: http://www.tek-tips.com/viewthread.cfm?qid=1209619
semble convenir à vos besoins.
la source
vous pouvez utiliser Error.stack pour tracer le nom de la fonction et la position exacte de l'endroit où vous vous trouvez.
Voir stacktrace.js
la source
Un moyen facile d'obtenir le nom de la fonction dans la fonction que vous exécutez.
la source
this
celui - ci peut être n'importe quoi. essai(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()