Warum sollte ich eine anonyme Funktion verwenden? Ich meine, was ist das eigentliche Geschäft damit? Ich verstehe das einfach nicht. Ich meine, Sie verwenden Funktionen, um den Code sauberer zu machen oder um ihn mehr als einmal zu verwenden. Aber anonyme Funktionen machen weder das Erste noch das Zweite. Ich habe sie gegoogelt und konnte niemanden finden, der das gleiche Problem hat.
Können Sie Schließungen aus dem Titel entfernen? Es ist leicht tangential zum Fleisch Ihrer Frage.
– Bradley Kreider
10. November 2010 um 18:05 Uhr
@rox0r – Sie glauben wirklich, dass Schließungen nichts miteinander zu tun haben? schien mir angemessen, also habe ich meine Antwort auf eine Weise eingebaut, von der ich hoffe, dass sie zur Demonstration nützlich ist. offensichtlich können Sie Lambda-Funktionen ohne Closures haben, aber nicht umgekehrt
– jon_darkstar
10. November 2010 um 18:17 Uhr
@jon: Ich denke, sie sind verwandt, aber seine Absicht schien sich auf nur benannt vs. anonym zu konzentrieren. Funktionen. Ich finde es gut, dass Sie Schließungen erwähnt haben, ich dachte nur, dass es im Titel irreführend ist.
– Bradley Kreider
10. November 2010 um 18:24 Uhr
Andrej
Ich würde sagen, dass anonyme Funktionen ihre Schönheit zeigen, wenn es gute Bibliotheksklassen/Funktionen gibt, die sie verwenden. Sie sind an sich nicht so sexy. In der Welt von .net gibt es eine Technologie namens LINQ, die auf sehr idiomatische Weise großen Gebrauch davon macht. Nun zurück zu PHP.
Etwas Philosophie. Was ist Funktion? Eine Funktionseinheit, die aufgerufen werden kann, und eine Code-Wiederverwendungseinheit. Manchmal benötigen Sie nur den ersten Teil: die Fähigkeit, Aktionen aufzurufen und auszuführen, aber Sie möchten ihn überhaupt nicht wiederverwenden und ihn sogar für andere Teile des Codes sichtbar machen. Das ist es, was anonyme Funktionen im Wesentlichen tun.
+1 für nicht-triviale Verwendung und zum Komponieren von Reduzieren und Filtern
– jon_darkstar
10. November 2010 um 18:12 Uhr
@jon_darkstar in C# ist es trivial 🙂 es ist eher funktionaler Stil.
– Andrej
10. November 2010 um 18:25 Uhr
Ich bin gerade auf meinen eigenen Reisen darüber gestolpert, es war fünf Jahre später sofort hilfreich. +1
– James Spence
24. März 2015 um 21:45 Uhr
Es ist besonders für Rückrufe nützlich:
array_walk($myArray, function($value, $key) {
// do something
});
wie ist es dann besser foreach? Dies ist ein bedeutungsloses Beispiel. Es zeigt etwas, was mit einem anderen Konstrukt noch einfacher gemacht werden kann. es zeigt nicht die Nützlichkeit der anonymen Funktion. Ja wirklich.
– Andrej
10. November 2010 um 18:05 Uhr
Der OP hat nicht gefragt, was besser ist. Es wurde gefragt, wozu es nützlich ist. Die Antwort: Rückrufe. Wenn Sie 1000 Beispiele geben möchten, können Sie dies gerne in Ihrer eigenen Antwort tun.
– Netcoder
10. November 2010 um 18:10 Uhr
Recht. “Es wurde gefragt, wofür es nützlich ist.” In Ihrem Beispiel sind sie überhaupt nicht nützlich. Ich sage nicht, dass Sie 1000 Beispiele liefern sollten. Einer könnte genügen, aber ein repräsentativer und relevanter.
– Andrej
10. November 2010 um 18:19 Uhr
@Andrey: Wenn Sie der Meinung sind, dass meine Antwort nicht nützlich genug ist, stimmen Sie sie nicht positiv ab und geben Sie eine Ihrer Meinung nach bessere Antwort an. Ende der Geschichte.
– Netcoder
10. November 2010 um 18:24 Uhr
NikiC
Anonyme Funktionen verwenden Sie in der Regel für Funktionen, die Sie nur einmal benötigen. Auf diese Weise verschmutzen Sie den Funktionsnamensraum nicht und erfinden keine seltsamen Funktionsnamen wie array_walk_callback1.
Hoffentlich erfinden Sie nie diese seltsamen Funktionsnamen. Dinge wie returnUsefulDataFromArray wäre nützlicher 🙂
– gnarf
10. November 2010 um 17:59 Uhr
Mchl
Der vielleicht offensichtlichste Grund ist die Verwendung von Rückrufen. Nehmen usort() Funktion zum Beispiel. Es hat keinen Sinn, eine einzeilige Funktion einzuführen, die nur einmal verwendet wird. Die anonyme Funktion passt (normalerweise) besser zu dieser Aufgabe.
Sie können anonyme Funktionen herumreichen, indem Sie sie in einer Variablen speichern.
$a=function() {
echo 'hello world';
};
Sie können sie also auch mehrfach verwenden.
Warum deklarieren Sie dann nicht einfach eine Funktion?
– Schuh
10. November 2010 um 18:07 Uhr
“mehr als einmal”. Können Sie die reguläre Funktion nicht mehr als einmal verwenden?
– Andrej
10. November 2010 um 18:07 Uhr
Sie sollten bedenken, dass deklarierte Funktionen global sind, anonyme Funktionen jedoch nicht. Sie wollen den globalen Namensraum nicht mit einmal verwendbaren und trivialen Funktionen verschmutzen
– bcosca
10. November 2010 um 18:08 Uhr
Außerdem können variable Funktionen mit zerstört werden unsetwährend globale Funktionen dies nicht können.
– Netcoder
10. November 2010 um 18:19 Uhr
@Abdul: Der Umfang ist in PHP und Java sehr unterschiedlich. Tatsächlich ist das Scoping in PHP auf den globalen Geltungsbereich und den Funktionsumfang beschränkt. z.B: { $foo = "bar"; } echo $foo; funktioniert in PHP. { String foo = "bar"; } System.out.println(foo); nicht in Java. Das Zurücksetzen von Variablen kann nützlich sein, um zu verhindern, dass der Bereich verschmutzt wird, was schließlich zu Programmierfehlern führen kann. Das gilt sowohl für Variablen als auch für Variablenfunktionen.
– Netcoder
10. Juli 2015 um 19:06 Uhr
Wenn Sie einen Rückruf erstellen müssen (um ein konkretes Beispiel zu nennen, sagen wir, es ist eine Vergleichsfunktion für usort), sind anonyme Funktionen normalerweise ein guter Weg. Besonders wenn die Definition der Funktion von wenigen Eingaben abhängig ist (damit meine ich eine Closure, die NICHT gleichbedeutend mit einer anon-Funktion ist)
function createCallback($key, $desc = false)
{
return $desc ?
function($a, $b) use ($key) {return $b[$key] - $a[$key];} :
function($a, $b) use ($key) {return $a[$key] - $b[$key];};
}
usort($myNestedArray, createCallback('age')); //sort elements of $myNestedArray by key 'age' ascending
usort($myNestedArray, createCallback('age', true); //descending
Warum deklarieren Sie dann nicht einfach eine Funktion?
– Schuh
10. November 2010 um 18:07 Uhr
“mehr als einmal”. Können Sie die reguläre Funktion nicht mehr als einmal verwenden?
– Andrej
10. November 2010 um 18:07 Uhr
Sie sollten bedenken, dass deklarierte Funktionen global sind, anonyme Funktionen jedoch nicht. Sie wollen den globalen Namensraum nicht mit einmal verwendbaren und trivialen Funktionen verschmutzen
– bcosca
10. November 2010 um 18:08 Uhr
Außerdem können variable Funktionen mit zerstört werden unsetwährend globale Funktionen dies nicht können.
– Netcoder
10. November 2010 um 18:19 Uhr
@Abdul: Der Umfang ist in PHP und Java sehr unterschiedlich. Tatsächlich ist das Scoping in PHP auf den globalen Geltungsbereich und den Funktionsumfang beschränkt. z.B: { $foo = "bar"; } echo $foo; funktioniert in PHP. { String foo = "bar"; } System.out.println(foo); nicht in Java. Das Zurücksetzen von Variablen kann nützlich sein, um zu verhindern, dass der Bereich verschmutzt wird, was schließlich zu Programmierfehlern führen kann. Das gilt sowohl für Variablen als auch für Variablenfunktionen.
– Netcoder
10. Juli 2015 um 19:06 Uhr
Schuh
Es gibt Zeiten, in denen Sie eine Funktion verwenden MÜSSEN. Somit halten Closures den Code sauber, indem Sie Ihre Bibliotheken nicht mit Funktionsdeklarationen füllen müssen, die nur an einer Stelle verwendet werden. Schließungen sind ähnlich wie style="" und Klassen in CSS. Sicher, Sie können eine Schiffsladung von Klassen für jeden einzelnen Stil erstellen, den Sie haben, oder Sie können sie an Ort und Stelle einbetten, da Sie sie nirgendwo anders verwenden und die Aufblähung Ihrer CSS-Dateien verringern.
Dies ist jedoch nicht unbedingt erforderlich. Wenn Sie also das Bedürfnis verspüren, Funktionen explizit zu deklarieren, können Sie dies tun.
Aber wenn ich diese Funktion nur einmal verwende, warum sollte ich dann nicht einfach überhaupt keine Funktionen deklarieren? Weder die normale noch die anonyme?
– Schuh
10. November 2010 um 17:57 Uhr
Und möchten Sie wirklich, dass Ihr HTML mit Tags verschmutzt wird, die die Präsentation und nicht den Inhalt beschreiben?
– gnarf
10. November 2010 um 18:00 Uhr
Anonyme Funktionen helfen, wenn Sie EINE FUNKTION VERWENDEN MÜSSEN – wie in usort, array_map usw. In diesen Fällen müssten Sie traditionell irgendwo im Code eine Funktion erstellen und den Namen der Funktion übergeben. Bei anonymen Funktionen können Sie einfach deklarieren es auf die Schnelle. Es hilft auch bei Rückrufen. Ihre Beispiele scheinen darauf hinzudeuten, dass Sie an anonyme Funktionen nur als Möglichkeiten zum Gruppieren von Code denken – was sie sein können, aber das ist nicht der eigentliche Zweck von ihnen.
– methodin
10. November 2010 um 18:00 Uhr
@charlie Manchmal muss eine Funktion als Parameter übergeben werden. Deshalb wird von Rückrufen gesprochen. Wenn Callbacks verwendet werden, müssen Sie dem Callback eine Funktion übergeben.
– Bradley Kreider
10. November 2010 um 18:03 Uhr
@rox0r Das habe ich verstanden, aber Sie könnten auch einen String mit dem Funktionsnamen als Callback verwenden. Wie auch immer, danke, ich weiß, ich weiß.
– Schuh
10. November 2010 um 18:09 Uhr
12964000cookie-checkWarum die anonyme Funktion verwenden? [duplicate]yes
Können Sie Schließungen aus dem Titel entfernen? Es ist leicht tangential zum Fleisch Ihrer Frage.
– Bradley Kreider
10. November 2010 um 18:05 Uhr
@rox0r – Sie glauben wirklich, dass Schließungen nichts miteinander zu tun haben? schien mir angemessen, also habe ich meine Antwort auf eine Weise eingebaut, von der ich hoffe, dass sie zur Demonstration nützlich ist. offensichtlich können Sie Lambda-Funktionen ohne Closures haben, aber nicht umgekehrt
– jon_darkstar
10. November 2010 um 18:17 Uhr
@jon: Ich denke, sie sind verwandt, aber seine Absicht schien sich auf nur benannt vs. anonym zu konzentrieren. Funktionen. Ich finde es gut, dass Sie Schließungen erwähnt haben, ich dachte nur, dass es im Titel irreführend ist.
– Bradley Kreider
10. November 2010 um 18:24 Uhr