Javascript: rekursive anonyme Funktion?
Sagen wir, ich habe eine grundlegende rekursive Funktion:
function recur(data) {
data = data+1;
var nothing = function() {
recur(data);
}
nothing();
}
Wie könnte ich dies tun, wenn ich eine anonyme Funktion wie...
(function(data){
data = data+1;
var nothing = function() {
//Something here that calls the function?
}
nothing();
})();
Ich möchte eine Möglichkeit zum Aufruf der Funktion, die diese Funktion aufgerufen... ich habe gesehen, Skripte irgendwo (ich kann mich nicht erinnern wo), dass kann Ihnen sagen, der name einer Funktion, die aufgerufen wird, aber ich kann mich nicht erinnern alle, dass die information jetzt.
InformationsquelleAutor der Frage Incognito | 2010-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du kann geben Sie der Funktion einen Namen, auch wenn Sie beim erstellen der Funktion als Wert und nicht ein "Funktionsdeklaration" - Anweisung. In anderen Worten:
ist ein Stapel-blowing-rekursive Funktion. Nun, das heißt, Sie
wahrscheinlich nichtSie vielleicht nicht wollen, dies zu tun in der Regel, denn es gibt einige seltsame Probleme mit den verschiedenen Implementierungen von Javascript. (Hinweis — das ist ein ziemlich alten Kommentar; einige/viele/alle der beschriebenen Probleme in Kangax blog-post festgelegt werden kann, die in mehr modernen Browsern.)Geben, wenn Sie einen Namen wie, dass, der name ist nicht außerhalb der Funktion sichtbar (gut, es soll nicht sein; das ist einer der weirdnesses). Es ist wie "letrec" in Lisp.
Als für
arguments.callee
dass ist nicht erlaubt in der "strict" - Modus und gilt allgemein als eine schlechte Sache, denn es macht einige Optimierungen hart. Es ist auch viel langsamer, als man erwarten könnte.Bearbeiten — Wenn Sie möchten, haben die Wirkung einer "anonym" - Funktion kann sich selbst aufrufen, können Sie so etwas tun (vorausgesetzt, Sie übergeben der Funktion als callback oder so ähnlich):
Was das tut, ist eine Funktion definieren, mit einem schönen, sicheren, nicht-broken-in-IE-Funktion Erklärung - Anweisung, zum erstellen einer lokalen Funktion, deren name nicht den globalen Namensraum verschmutzen. Die wrapper - (wirklich anonyme) Funktion nur zurück, dass die lokalen Funktion.
InformationsquelleAutor der Antwort Pointy
Menschen gesprochen, die Y combinator in den Kommentaren, aber niemand schrieb es als Antwort.
Den Y-combinator können definiert werden in javascript wie folgt: (Dank steamer25 für den link)
Und wenn Sie übergeben möchten, dass Ihre anonymen Funktion:
Die wichtigste Sache zu beachten, über diese Lösung ist, dass Sie sollten nicht es verwenden.
InformationsquelleAutor der Antwort zem
Ich würde dies nicht als eine inline-Funktion. Es drückt gegen die Grenzen des guten Geschmacks und nicht wirklich bekommen Sie nichts.
Wenn Sie wirklich müssen, es ist
arguments.callee
wie in Fabrizio ' s Antwort. Dies ist jedoch im Allgemeinen als kontraindiziert, und ist verboten, in ECMAScript Fifth Edition 'strict mode'. Obwohl ECMA-3-und nicht-strict-Modus sind nicht Weg, die Arbeit im strikten Modus verspricht mehr möglich Sprache Optimierungen.Kann man auch mit einem Namen der inline-Funktion:
Jedoch die Namen der inline-Funktion-Ausdrücke sind auch am besten vermieden werden, als IE JScript hat einige schlimme Dinge zu Ihnen. Im obigen Beispiel
foo
falsch, belastet die übergeordneten Bereich im IE, und die Elternfoo
ist eine separate Instanz, diefoo
innen gesehenfoo
.Was ist der Zweck der Umsetzung dieser in ein inline-anonym-Funktion? Wenn Sie nur wollen, um zu vermeiden verschmutzen den übergeordneten Bereich, können Sie natürlich verstecken Sie Ihre erste Beispiel in ein anderes selbst-aufrufende-anonym-Funktion (Namensraum). Tun Sie wirklich brauchen, um erstellen Sie eine neue Kopie von
nothing
jeder Zeit rund um die Rekursion? Könnten Sie besser dran mit einem Namensraum mit zwei einfachen gegenseitig-rekursive Funktionen.InformationsquelleAutor der Antwort bobince
Kann es am einfachsten sein, verwenden Sie ein "anonymes Objekt" statt:
Ihre globalen Raum ist völlig unbelastet. Es ist ziemlich einfach. Und man kann leicht nutzen Sie die das Objekt nicht-globalen Zustand.
InformationsquelleAutor der Antwort svidgen
InformationsquelleAutor der Antwort
Könnte man etwas machen wie:
oder in deinem Fall:
InformationsquelleAutor der Antwort ArtBIT
Bei der Deklaration einer anonymen Funktion wie diese:
Seine als Funktion Ausdruck und es hat einen optionalen Namen (, die Sie verwenden können, rufen Sie es von sich selbst. Sondern weil es eine Funktion Ausdruck (und keine Anweisung) es bleibt anonym (hat aber einen Namen, den Sie anrufen können). Also diese Funktion kann sich selbst aufrufen:
InformationsquelleAutor der Antwort xj9
Warum nicht über die Funktion der functio selbst ?
InformationsquelleAutor der Antwort Riccardo Bassilichi
Ich bin nicht sicher, ob die Antwort noch benötigt, aber dies kann auch durchgeführt werden mit Delegierten, erstellt mit Funktion.Bindung:
Diese nicht mit der genannten Funktionen oder Argumente.angerufene.
InformationsquelleAutor der Antwort Nitij
Wie bobince schrieb, einfach den Namen Ihrer Funktion.
Aber, ich vermute, Sie wollen auch übergeben in einem Anfangswert und stoppen Sie Ihre Funktion irgendwann!
arbeiten jsFiddle-Beispiel (nutzt data += data for fun)
InformationsquelleAutor der Antwort Peter Ajtai
brauchte ich (oder vielmehr wollte) einen one-liner anonyme Funktion zu Fuss seinen Weg nach oben ein Objekt Gebäude, bis ein string ist, und behandelt es so:
erzeugt einen string wie 'Root : foo : bar : baz : ...'
InformationsquelleAutor der Antwort radio_babylon
Andere Antwort die nicht die benannte Funktion oder Argumente.aufgerufene
InformationsquelleAutor der Antwort jforjs
Dies ist ein rework von jforjs Antwort, mit unterschiedlichen Namen und leicht geänderten Eintrag.
Gab es keine Notwendigkeit, entrollen Sie die erste Rekursion. Die Funktion erhalten sich als Referenz reicht zurück bis in die ur-Schlamm der OOP.
InformationsquelleAutor der Antwort englebart
Dies ist eine version von @zem ist die Antwort mit den Pfeil-Funktionen.
Können Sie die
U
oder dieY
combinator. Y combinator wird das einfachste zu verwenden.U
combinator, mit dieser haben Sie zu halten, vorbei an der Funktion:const U = f => f(f)
U(selfFn => arg => selfFn(selfFn)('to infinity and beyond'))
Y
combinator, mit diesem können Sie nicht haben, um halten Sie übergeben der Funktion:const Y = gen => U(f => gen((...args) => f(f)(...args)))
Y(selfFn => arg => selfFn('to infinity and beyond'))
InformationsquelleAutor der Antwort Ricardo Freitas
Dies kann nicht überall funktionieren, aber Sie können
arguments.callee
zu finden, um die aktuelle Funktion.So, Fakultät getan werden könnte, also:
InformationsquelleAutor der Antwort Dan Jones