J'essaie d'obtenir le nom de la fonction en cours d'exécution. D'après ce que j'ai lu, cela devrait être possible en utilisant: Cependant, lorsque j'exécute cela dans Firefox et Safari (dernières versions sur Mac), le nom n'est pas retourné. P> console.log (arguments.callee) renvoie la source de la fonction, mais pas le nom attribué. arguments.callee.name renvoie une chaîne vide. P> Mon code d'échantillon est la suivante: P> var testobj = {
testfunc: function(){
console.log( (arguments.callee.toString()).match(/function\s+(\[^\s\(]+)/) );
}
}
testobj.testfunc();
8 Réponses :
Vous avez déclaré une fonction anonyme avec vous devez le déclarer comme p> pour obtenir le nom imprimé. P> p>
Sachez que les expressions de fonction nommées (qui sont ce que vous suggérez) se comporter curieusement dans IE. Voir youra.thinkwebweb2.com/named-function-expressions
Pour clarifier: Dans le cas du style d'objet ci-dessus, ce serait {testfunc: fonction testfuncunc () {... code>. C'est également agréable de faire lors du débogage des choses dans le navigateur, aide le débogueur vous aider à voir quelle fonction vous avez des problèmes.
Selon la machine de navigager, le commentaire de @timdown's Redirige vers kangax.github.com/nfe a> avant l'expiration du nom de domaine
/function\s+(\[^\s\(]+)/ What's with the backslash before [? I don't think you want a literal square bracket here. Without that it should work.Although I'd strongly recommend against anything to do with sniffing function name or especially sniffing caller function. Almost anything you might do using these hideous hacks will be better done using some combination of closures and lookups.
Tout d'abord, la fonction n'a pas de nom. Le nom de la fonction est ce que vous mettez dans la fonction entre code> et la liste des arguments (...) code>. Voici comment obtenir le nom d'une fonction (N'utilisez pas la propriété nom code>, comme cela peut être modifié): var fName = arguments.callee.toString(0).match(
/^function\s*(?:\s+([\w\$]*))?\s*\(/
);
fName = (fName ? fName[1] : "");
"N'utilisez pas la propriété Nom, comme cela peut être changé" - Eh bien, la méthode Tostring () peut être modifiée aussi ...
Les arguments typiques.Callee hacks ne fonctionnent pas ici car ce que vous avez fait est attribué une fonction anonyme comme valeur de la touche "TestFunc" de l'objet. Dans ce cas, le piratage aggrave même, mais cela peut être fait, comme suit:
J'ai trouvé que si vous enregistrez simplement l'objet de la fonction, comme: ou p> que vous obtenez simplement la fonction Nom dans le journal de la console avec quelques options. p> p>
sur Firefox 3.5, Safari 5 et Chrome 6.0 Vous pouvez utiliser:
function myFunctionName() {
alert("Name is " + arguments.callee.name );
}
myFunctionName();
Je pense qu'il y a une solution beaucoup plus propre et élégante à 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 le propriétaire de la fonction est "Fenêtre" ou un autre objet global, nous pouvons accéder à l'objet global via le Ceci Mot clé, nous pouvons accéder à la fonction elle-même via arguments.callee b> et nous pouvons accéder à tous les noms d'objet (fonction) du parent via pour (var o dans cette) b>, Donc, vous devriez être capable d'obtenir les informations souhaitées assez facilement comme ... returnMyName = function() {
for (var o in this) {
if (arguments.callee===this[o]) return o;
}
};
Function.prototype.getName = function(fn) {
if(Function.name || Function.prototype.name) return this.name;
return this.toString().match(/^function\s+(\w+)\s*\(/)[1];
};
S'il vous plaît ajouter une description de la réponse!
Puis-je demander, pourquoi voulez-vous / besoin de faire cela?
Yah. Donc, je travaille sur un projet d'animal de compagnie impliquant la chaîne de fonction. J'ai environ 50 fonctions différentes qui gèrent tous le même code, sauf qu'une variable particulière d'entre eux est définie comme le même nom de la fonction. Je souhaite réduire toute la duplication à une seule fonction qui détecte le nom de la fonction d'appel et utilise ce nom comme variable actuellement codée en dur. Avec cette méthode, je peux définir toutes mes fonctions en une seule ligne.
Tostring () Code> Ing Fonctions comme ceci (la fonction AKA "Décompilation") a ses verrues. Voir perfectionkills.com/those-tricky-fonctions , perfectionkills.com/deectting-built-in-host-methods , my.opera.com/hallvors/blog/show.dml/1665828 et mon.opera.com/hallvors/blog/2007/07/07/2007/07/07/...Je dois dire que je suis assez déçu par les réponses pauvres absolument pauvres à cette question, aucune d'entre elles ne semble avoir été testée.