Peut une fonction JavaScript de retour lui-même?
Puis-je écrire une fonction qui renvoie iteself?
Je lisais certains de description sur les fermetures - voir l'Exemple 6 - lorsqu'une fonction a été de retour d'une fonction, de sorte que vous pourriez appeler func()();
comme du JavaScript valide.
Donc je me demandais pourrait un retour de la fonction elle-même de telle manière que vous pourriez chaîne à elle-même indéfiniment comme ceci:
func(arg)(other_arg)()(blah);
À l'aide de arguments
objet, le destinataire de l'appel ou de l'appelant?
Vous devez vous connecter pour publier un commentaire.
Il y a 2-3 façons. On est, comme vous le dites, est d'utiliser
arguments.callee
. Il peut être le seul moyen si vous avez affaire à une fonction anonyme qui n'est pas stocké affectée à une variable quelque part (que vous connaissez):Le 2ème est d'utiliser le nom de la fonction
Et la dernière consiste à utiliser une fonction anonyme affectée à une variable, mais vous devez savoir que la variable, donc dans ce cas je ne vois aucune raison pourquoi vous ne pouvez pas donner un nom à la fonction, et d'utiliser la méthode ci-dessus
Ils sont tous identiques, mais
callee
est le plus simple.Edit: Et je suis d'accord avec SLaks; je ne peux pas le recommander soit
arguments.callee
déclenche une erreur dans l'ES5 Strict ejohn.org/blog/ecmascript-5-strict-mode-json-and-more(function X() {return X;})()()()().... ;
ainsi aleviating autodérision question. Le nom de la fonction s'affiche également dans les traces de pile. C'est concis, de la conformité et de ne pas polluer l'espace de noms.Oui.
Juste
return arguments.callee;
Cependant, cela est susceptible de générer du code source de confusion; je ne le recommande pas.
arguments.callee
pour deux raisons: 1. Les fonctions sont généralement optimisés par des implémentations, si vous n'utilisez pas learguments
objet, il ne sera pas généralement créés (le contexte d'exécution sera initialisé plus rapide) -bien sûr, si la fonction utiliseeval
, il peut généralement pas être optimisé. 2. Learguments
objet des modifications sur ES5 mode strict, et laarguments.callee
propriété a été refusée (encore une fois également à des fins d'optimisation et de sécurité), donc en gros, écrire avenir code, je le recommande à juste le nom de la fonction. 🙂callee
n'est plus autorisé? Je pensais que c'étaitcaller
.caller
AFAIR a en fait jamais partie de la spec, mais il a été soutenu par de nombreuses implémentations, c'est pourquoi sur ES5, pour de strictes fonctions, les deuxcaller
etcallee
sont affectés à un lanceur de fonction voir le l'Étape 14 en 10.6 Objet Argumentsarguments
la création d'un objet affecte les performances. BTW, lecaller
propriété était vraiment dangereux, elle a permis de "casser" les bouchons dans certaines implémentations, par exemple dans Spidermonkey certaines techniques de comme ceci permettent de fuite en privé étendue de fonctions.Vous pouvez faire ce que vous voulez comme suit:
les arguments.le destinataire de l'appel n'est pas prise en charge en JavaScript en mode strict.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
Même trieuse que tous les ci-dessus est:
JS:
Il y a une façon simple d'obtenir ce procédant de la manière suivante:
Il est également possible de retourner l'argument de l'auto invokable fonction comme