140 votes

JavaScript : fonction anonyme récursive ?

Disons que j’ai ont une fonction récursive de base :

Comment pourrais je faire cela si j’ai une fonction anonyme comme...

Je voudrais un moyen d’appeler la fonction qui a appelé cette fonction... J’ai vu quelque part (je ne me souviens plus où) que vous pouvez dire le nom d’une fonction appelée de scripts, mais je ne me souviens pas une de ces informations dès maintenant.

161voto

Pointy Points 172438

Vous pouvez donner un nom à la fonction, même lorsque vous êtes à la création de la fonction comme une valeur et non une "déclaration de fonction". En d'autres termes:

(function foo() { foo(); })();

est une pile de soufflage en fonction récursive. Maintenant, cela étant dit, vous ne voulez probablement pas à le faire en général car il y a des problèmes bizarres avec les différentes implémentations de Javascript. (note — c'est un assez vieux commentaire; certains/beaucoup/tous les problèmes décrits dans Kangax du blog peut être fixe en plus des navigateurs modernes.)

Lorsque vous donnez un nom comme ça, le nom n'est pas visible en dehors de la fonction (bon, c'est pas censé être; c'est l'un des weirdnesses). C'est comme "letrec en Lisp.

Comme pour arguments.callee, c'est rejetée au "strict" mode et est généralement considéré comme une mauvaise chose, car cela fait quelques optimisations dur. Il est aussi beaucoup plus lent que l'on pourrait attendre.

modifiez — le Si vous voulez avoir l'effet d'un "anonyme", fonction qui peut s'appeler lui-même, vous pouvez faire quelque chose comme ceci (en supposant que vous êtes de passage à la fonction de rappel, ou quelque chose comme ça):

asyncThingWithCallback(params, (function() {
  function recursive() {
    if (timeToStop())
      return whatever();
    recursive(moreWork);
  }
  return recursive;
})());

Ce qui n'est de définir une fonction avec une belle, coffre-fort, non-cassé-dans-IE de la fonction de déclaration en déclaration, la création d'une fonction locale dont le nom ne sera pas polluer l'espace de noms global. Le wrapper (vraiment anonyme) la fonction renvoie simplement que la fonction locale.

36voto

zem Points 841

On parlait de l’Y combinator dans les commentaires, mais personne n’écrit comme une réponse.

Le Y combinator peut être défini en javascript comme suit : (Merci à steamer25 pour le lien)

Et lorsque vous souhaitez passer votre fonction anonyme :

Le plus important à noter concernant cette solution, c’est que vous ne devriez pas l’utiliser.

13voto

bobince Points 270740

Je ne ferais pas cela comme une fonction inline. C'est en appuyant sur les limites du bon goût et n'a pas vraiment quoi que ce soit.

Si vous devez vraiment, n'est - arguments.callee comme en Fabrizio de réponse. Cependant, ce qui est généralement considéré comme inopportun et est rejetée dans ECMAScript Cinquième Édition de la "stricte mode". Bien que l'ECMA 3 et non-stricte-mode ne vont pas loin, en travaillant en mode strict promet plus possible de la langue d'optimisations.

On peut aussi utiliser un nom de fonction inline:

(function foo(data){
    data++;
    var nothing = function() {
        foo(data);
    }
    nothing();
})();

Quel que soit le nom de la fonction inline expressions sont aussi à éviter, comme IE JScript fait de mauvaises choses. Dans l'exemple ci - foo incorrectement pollue la portée parent dans IE, et le parent foo est une instance distincte de l' foo vu à l'intérieur de foo.

Quel est le but de la mise en ligne fonction anonyme? Si vous voulez juste pour éviter de polluer le parent, bien sûr, vous pouvez masquer votre premier exemple à l'intérieur d'une autre auto-appel-anonyme-fonction (espace de noms). Avez-vous vraiment besoin de créer une nouvelle copie de nothing chaque fois autour de la récursivité? Vous pourriez être mieux avec un espace de noms qui contient deux simples mutuellement des fonctions récursives.

8voto

ArtBIT Points 1672

Vous pourriez faire quelque chose comme :

ou dans votre cas :

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