Nommage d'une fonction anonyme
Est-il possible de faire en quelque sorte de définir un nom pour les fonctions anonymes?
Il n'est pas nécessaire d'ajouter les noms de fonction à l'espace de noms pour les fonctions anonymes, mais je voudrais éviter de voir une grande quantité de (?) dans mon débogueur javascript donc je peux garder la trace de pile d'appel informatif.
Aussi je peux passer à la normale déclaré fonctions comme arguments à la place des fonctions anonymes, ou vais-je marcher dans d'étranges erreurs. Il semble fonctionner.
$("object").bind("click", function() { alert("x"); });
$("object").bind("click", function debuggingName() { alert("x"); });
[Modifier]
Je voulais dire quelque chose le long de l'aime de
$("object").bind("click", function() { Function.Name = "debuggingName"; alert("x"); });
- un nom de fonction anonyme est une contradiction dans les termes!!
- Êtes-vous certains d'erreur lorsque vous utilisez votre deuxième construire au-dessus?
- Je veux juste mettre quelque chose dans une fonction anonyme que le débogueur peut récupérer et afficher utile de débogage nom de la fonction. Je veux les utiliser exactement comme je voudrais utiliser les fonctions anonymes
- avez-vous essayé $("objet").bind("click", function MY_NOT_SO_ANONYMOUS_FUNCTION_NAME () { alert("x"); });
- comment est-ce différent du deuxième exemple que j'ai? Oui, j'ai. c'est probablement la meilleure façon de le gérer.
- Désolé, je dois avoir manqué que vous avez déjà écrit que. C'est exactement le même que votre deuxième exemple.
Vous devez vous connecter pour publier un commentaire.
Votre deuxième exemple est à l'aide d'un fonction nommée expression, qui fonctionne bien dans la plupart des navigateurs, mais a des problèmes c'est à dire que vous devriez être au courant avant de l'utiliser. Je recommande la lecture de kangax l'excellent article sur ce sujet.
if
bloc d'être une erreur de syntaxe. kangax de l'article couvre que trop: kangax.github.com/nfe/#function-statementsvar name = function thing() {}
est une fonction nommée expression.var name = function() {}
est juste une expression de fonction. La distinction entre fonction nommée expressions, les instructions de fonction et les déclarations de fonction est basé sur le contexte. Si c'est un endroit où l'interprète s'attend à une expression (par exemple dans une déclaration de variable), puis il va être nommé en fonction de l'expression. Si elle est dans le code mondial ou à l'intérieur d'une fonction (mais pas à l'intérieur d'un bloc, dans les deux cas), c'est une déclaration de fonction. Si c'est à l'intérieur d'un bloc (par exemple, unif
bloc), c'est une instruction de fonction.Vous pourriez faire quelque chose comme ceci avec une flèche fonctions, il fonctionne pour moi sur le Nœud.
MDN est quelque peu trompeur ici:
Cette réponse fournit plus de détails.
J'ai l'habitude de faire:
$("objet").bind("click"
le nom de la fonction() {
alert("x");
});
et ne courez pas dans les problèmes.
Cela est encouragé dans certaines des plus grandes bibliothèques:
https://groups.google.com/forum/m/#!topic/firebug/MgnlqZ1bzX8
http://blog.getfirebug.com/2011/04/28/naming-anonymous-javascript-functions/
Si dynamique nom de la fonction est la question. Vous pouvez essayer ceci:
source: Nate Ferrero à Comment définir dynamiquement une fonction/nom de l'objet en Javascript comme il est affiché dans le navigateur Chrome
Avec ECMAScript2015 (ES2015, ES6) spécification de langage, il est possible de le faire sans l'utilisation de lent et dangereux eval fonction et sans Objet.defineProperty méthode qui corrompt à la fois la fonction de l'objet et ne fonctionne pas dans certains aspects cruciaux de toute façon.
Voir, par exemple, ce
nameAndSelfBind
fonction qui est capable à la fois le nom d'une fonction anonyme, et de le renommer les fonctions nommées, ainsi que la liaison de leur propre corps pour eux-mêmes comme ce et de stocker les références aux traités fonctions pour être utilisé à l'extérieur de son champ d'application (JSFiddle):Une fonction anonyme est une fonction sans nom, il est exécuté à partir d'où il est défini. Alternativement, vous pouvez définir la fonction de débogage avant de l'utiliser.