239 votes

Puis-je obtenir le nom de la fonction en cours d’exécution en JavaScript ?

Est-il possible de le faire :

I've got les cadres Dojo et jQuery dans ma pile, ainsi si ou l’autre de ceux qui le rendent plus facile, ils sont disponibles.

231voto

Matt Points 942

Vous devriez être en mesure de l'obtenir en utilisant arguments.callee.

Vous pourriez avoir à analyser le nom même si, comme il sera probablement inclure certains supplémentaire indésirable. Bien que, dans certaines implémentations, vous pouvez simplement obtenir le nom à l'aide d' arguments.callee.name.

L'analyse:

function DisplayMyName() 
{
   var myName = arguments.callee.toString();
   myName = myName.substr('function '.length);
   myName = myName.substr(0, myName.indexOf('('));

   alert(myName);
}

Edit: L'exemple de code ci-dessus est légèrement modifié copie prise sur Javascript - en cours nom de la fonction.

94voto

fforw Points 2548

Pour les fonctions non anonyme

Mais dans le cas d’un gestionnaire d’erreur le résultat serait le nom de la fonction de gestionnaire d’erreur, wouldn ' t it ?

21voto

Andy E Points 132925

Cela devrait le faire :

L’appelant, il suffit d’utiliser `` .

11voto

James Hugard Points 2113

Cela doit aller dans la catégorie des « hacks plus laids du monde », mais vous pouvez y aller.

En premier lieu, le nom de la fonction en cours (comme dans les autres réponses) semble ont un usage limité pour moi, depuis vous sorte de déjà savez quelle est la fonction !

Cependant, en découvrant le nom de l' appelant fonction pourrait être très utile pour une fonction de trace. C’est avec une regexp, mais utiliser indexOf serait environ 3 x plus vite :

3voto

Sampiolin Points 31

Un autre cas d'utilisation pourrait être un répartiteur d'événements liés à l'exécution:

MyClass = function () {
  this.events = {};

  // Fire up an event (most probably from inside an instance method)
  this.OnFirstRun();

  // Fire up other event (most probably from inside an instance method)
  this.OnLastRun();

}

MyClass.prototype.dispatchEvents = function () {
  var EventStack=this.events[GetFunctionName()], i=EventStack.length-1;

  do EventStack[i]();
  while (i--);
}

MyClass.prototype.setEvent = function (event, callback) {
  this.events[event] = [];
  this.events[event].push(callback);
  this["On"+event] = this.dispatchEvents;
}

MyObject = new MyClass();
MyObject.setEvent ("FirstRun", somecallback);
MyObject.setEvent ("FirstRun", someothercallback);
MyObject.setEvent ("LastRun", yetanothercallback);

L'avantage ici est le répartiteur peut être réutilisé facilement et n'ont pas à recevoir de l'envoi de la file d'attente comme un argument, au lieu de cela il s'agit implicite avec l'invocation du nom de...

En fin de compte, le cas général présenté ici serait "en utilisant le nom de la fonction en tant qu'argument de sorte que vous n'avez pas à passer explicitement", et qui pourrait être utile dans de nombreux cas, tels que le jquery animate() option de rappel, ou dans les délais d'attente/intervalles de rappels, (c'est à dire vous passez uniquement une fonction de NOM).

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