<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=R%C3%BCckruffunktion</id>
	<title>Rückruffunktion - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=R%C3%BCckruffunktion"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=R%C3%BCckruffunktion&amp;action=history"/>
	<updated>2026-06-03T11:30:25Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=R%C3%BCckruffunktion&amp;diff=170069&amp;oldid=prev</id>
		<title>imported&gt;Siegbert v2: /* Weblinks */ phpblogger.net ist inzwischen offline und agiert als Spam-WL=&gt; Archivversion</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=R%C3%BCckruffunktion&amp;diff=170069&amp;oldid=prev"/>
		<updated>2026-04-04T14:17:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Weblinks: &lt;/span&gt; phpblogger.net ist inzwischen offline und agiert als Spam-WL=&amp;gt; Archivversion&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Eine &amp;#039;&amp;#039;&amp;#039;Rückruffunktion&amp;#039;&amp;#039;&amp;#039; ({{EnS|Callback}}) bezeichnet in der Informatik eine [[Funktion (Programmierung)|Funktion]], die einer anderen Funktion, meist einer vorgefertigten Bibliotheks- oder Betriebssystemfunktion, als [[Parameter (Informatik)|Parameter]] übergeben und von dieser unter definierten Bedingungen mit definierten Argumenten aufgerufen wird. Dieses Vorgehen folgt dem [[Entwurfsmuster]] der &amp;#039;&amp;#039;[[Inversion of Control]]&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Meistens erlaubt die vorgefertigte Funktion die Übergabe eines sog. Benutzerparameters &amp;lt;code&amp;gt;lpParameter&amp;lt;/code&amp;gt;, der von ihr (neben anderen Argumenten) zur Rückruffunktion durchgereicht wird, damit letztere im Kontext des ursprünglichen Aufrufers Daten sowohl abgreifen wie ablegen kann.&lt;br /&gt;
&lt;br /&gt;
== Rückruf im selben Ablauf ==&lt;br /&gt;
[[Datei:ProgramExecCallbackSimple-de.png|rahmenlos|hochkant=1.5|rechts]]&lt;br /&gt;
{{nowrap|Das Bild zeigt einen Aufruf einer Routine eines anderen Kontextes}} (Betriebssystemaufruf, anderes Softwaremodul). Diesem Aufruf wird eine Referenz auf die Rückrufroutine übergeben. Die aufgerufene Routine kann dann in ihrem Ablauf die Rückrufroutine aufrufen. Die Rückrufroutine legt letztlich Daten ab, die im weiteren Programmablauf nach Rückkehr des ursprünglichen Aufrufes verwendet werden können. In der englischen Literatur wird diese Form als &amp;#039;&amp;#039;blocking callback&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;synchronous callback&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Der Vorteil dieser Technik besteht darin, dass der Zugriff auf die Daten im eigenen Kontext formuliert wird und/oder im Rückruf eine beliebige programmtechnische Aufbereitung erfolgen kann: Die Parameter und der Aufrufzeitpunkt werden im anderen Softwaremodul bestimmt, die Bestimmung, was im Rückruf ausgeführt wird, obliegt dem eigenen Softwaremodul.&lt;br /&gt;
&lt;br /&gt;
Dadurch wird ermöglicht, Funktionen allgemein zu definieren und erst beim Aufrufen der Funktion durch Angabe der Rückruffunktion das Verhalten exakt zu bestimmen. Häufig bekommt eine Rückruffunktion gar keinen Namen, sondern wird als &amp;#039;&amp;#039;[[Anonyme Subroutine|anonyme Funktion]]&amp;#039;&amp;#039; direkt beim Aufruf definiert (siehe auch [[Lambda-Kalkül]]). Über Rückruffunktionen erreicht man eine [[lose Kopplung]] zwischen einzelnen Komponenten.&lt;br /&gt;
&lt;br /&gt;
== Rückruf aus einem anderen Thread ==&lt;br /&gt;
[[Datei:Callback mit Thread-Interkommunikation.png|rahmenlos|hochkant=1.5|rechts]]&lt;br /&gt;
{{nowrap|Bei Angabe einer Rückruffunktion ist es der aufgerufenen Funktion}} überlassen, wann diese den Rückruf ausführt ([[Inversion of Control]]). Es ist möglich, dass der Rückruf zu einem späteren Zeitpunkt aus einem anderen [[Thread (Informatik)|Thread]] heraus erfolgt. Das nebenstehende Bild zeigt das Prinzip. Die Zuordnung der Rückrufroutine zum eigenen Kontext ist die Gleiche wie im obigen Schema. Da der Rückruf in einem anderen Thread erfolgen kann, sind aber zusätzlich die Bedingungen für eine Datenkonsistenz ([[Mutex]]) einzuhalten. In der englischen Literatur wird diese Form als &amp;#039;&amp;#039;deferred callback&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;asynchronous callback&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel dafür ist der Aufruf &amp;lt;code&amp;gt;SetTimer(hWnd, ident, milliseconds, callbackRoutine)&amp;lt;/code&amp;gt; in der Windows-API. Der Aufruf &amp;lt;code&amp;gt;SetTimer(...)&amp;lt;/code&amp;gt; ist ein kurzer Betriebssystemaufruf, der nur im Betriebssystem den Timer initialisiert. Die &amp;lt;code&amp;gt;callbackRoutine&amp;lt;/code&amp;gt; wird erst dann aufgerufen, wenn die Zeit abgelaufen ist. Das geschieht in einem Thread des Betriebssystems unabhängig vom Ablauf nach dem Aufruf von &amp;lt;code&amp;gt;SetTimer(...)&amp;lt;/code&amp;gt;. In der bereitzustellenden Rückrufroutine kann beliebiger Code ausgeführt werden. Es ist allerdings dabei zu beachten, dass die Rückrufroutine nur kurz und nicht blockierend sein darf. Sonst besteht die Gefahr, dass das gesamte Betriebssystem oder mindestens der aktuelle Prozess blockiert. Letztlich sollte die Rückrufroutine eigentlich nur Daten ablegen und nicht selbst komplexe Aktionen beinhalten. Insbesondere kann für eine [[Ereignis (Programmierung)|ereignisorientierte Programmierung]] eine Event-Instanz erzeugt und abgelegt werden, die weitere Abläufe steuert.&lt;br /&gt;
&lt;br /&gt;
== Dauerhafte Rückrufroutine ==&lt;br /&gt;
Eine Rückrufroutine kann nur jeweils für einen Aufruf gelten. Die Rückrufroutine kann in Bezug zum Aufruf auch mehrmals gerufen werden, bis die zugehörige Aktion beendet ist, also zeitlich begrenzt.&lt;br /&gt;
&lt;br /&gt;
Aber auch die dauerhafte Zuordnung einer Routine wird teilweise als &amp;#039;&amp;#039;callback routine&amp;#039;&amp;#039; bezeichnet, beispielsweise ThreadProc callback function:&amp;lt;ref&amp;gt;[http://msdn.microsoft.com/en-us/library/windows/desktop/ms686736(v=vs.85).aspx msdn.microsoft...]&amp;lt;/ref&amp;gt; Bei der Anlage eines Threads über die Windows-API wird die Threadfunktion als &amp;#039;&amp;#039;callback function&amp;#039;&amp;#039; angegeben.&lt;br /&gt;
&lt;br /&gt;
Die Zuordnung einer Ereignisbehandlungsroutine beispielsweise zu einem HTML-Element &amp;lt;code&amp;gt;&amp;amp;lt;button onclick=&amp;quot;function()&amp;quot; /&amp;amp;gt;&amp;lt;/code&amp;gt; oder zu einem [[Widget]] innerhalb einer Programmierung grafischer Benutzeroberflächen folgt demselben Schema, wird aber in diesem Zusammenhang gewöhnlich nicht als &amp;#039;&amp;#039;callback&amp;#039;&amp;#039;, sondern als &amp;#039;&amp;#039;event handler&amp;#039;&amp;#039; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
== Einfache Rückruffunktion oder objektorientierter Rückruf ==&lt;br /&gt;
Die sogenannten &amp;#039;&amp;#039;callback function&amp;#039;&amp;#039; in der Windows-API sind jeweils einfache C-Funktionen. Die Windows-API wird als C-Schnittstelle bereitgestellt. In Foren gibt es häufig Fragen nach der Möglichkeit, C++-Funktionen zuzuordnen. Notwendig ist hier eine Kapselung des C++-Aufrufes in einer C-Funktion, die die Dateninstanz kennt.&lt;br /&gt;
&lt;br /&gt;
Anders ist es in objektorientierten Ansätzen eines Rückrufes. Statt der Angabe eines Funktionszeigers wird die Referenz auf ein Datenobjekt für den Rückruf übergeben. Das Datenobjekt muss ein für den Rückruf bestimmtes [[Schnittstelle (Objektorientierung)|Interface]] realisieren. Das Interface enthält dann mehrere mögliche Rückruffunktionen in der [[Tabelle virtueller Methoden]] innerhalb der Dateninstanz und kennt gleichzeitig die notwendigen Daten für die Ausführung des Rückrufes. Das Grundschema ist genau das gleiche wie in den obigen Schemata gezeigt.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Es soll eine Funktion &amp;lt;code&amp;gt;apply_to&amp;lt;/code&amp;gt; geschrieben werden, die eine beliebige andere [[Funktion (Programmierung)|Funktion]] auf eine [[Liste (Datenstruktur)|Liste]] von Werten anwendet und eine Liste der Ergebnisse zurückgibt. Eine Umsetzung in [[Pseudocode]]:&lt;br /&gt;
&lt;br /&gt;
 function &amp;#039;&amp;#039;&amp;#039;apply_to&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;rückruffunktion&amp;#039;&amp;#039;, &amp;#039;&amp;#039;werte&amp;#039;&amp;#039;):&lt;br /&gt;
     var &amp;#039;&amp;#039;ergebnis&amp;#039;&amp;#039;; // Liste für die Ergebnisse&lt;br /&gt;
     foreach &amp;#039;&amp;#039;w&amp;#039;&amp;#039; in &amp;#039;&amp;#039;werte&amp;#039;&amp;#039; do // für alle Werte ...&lt;br /&gt;
         &amp;#039;&amp;#039;e&amp;#039;&amp;#039; = &amp;#039;&amp;#039;rückruffunktion&amp;#039;&amp;#039; (&amp;#039;&amp;#039;w&amp;#039;&amp;#039;); // rufe die Rückruffunktion ...&lt;br /&gt;
         &amp;#039;&amp;#039;ergebnis[]&amp;#039;&amp;#039; = &amp;#039;&amp;#039;e&amp;#039;&amp;#039;;   // und hänge das Resultat an die Ergebnisliste an.&lt;br /&gt;
     end;&lt;br /&gt;
     return &amp;#039;&amp;#039;ergebnis&amp;#039;&amp;#039;;&lt;br /&gt;
 end apply_to;&lt;br /&gt;
&lt;br /&gt;
Diese Funktion kann jetzt folgendermaßen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
 function &amp;#039;&amp;#039;&amp;#039;verdoppeln&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;wert&amp;#039;&amp;#039;): // dies ist eine Rückruffunktion&lt;br /&gt;
     return &amp;#039;&amp;#039;wert&amp;#039;&amp;#039;*2;&lt;br /&gt;
 end verdoppeln;&lt;br /&gt;
&lt;br /&gt;
 function &amp;#039;&amp;#039;&amp;#039;quadrat&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;wert&amp;#039;&amp;#039;): // dies ist eine andere Rückruffunktion&lt;br /&gt;
     return &amp;#039;&amp;#039;wert&amp;#039;&amp;#039;*&amp;#039;&amp;#039;wert&amp;#039;&amp;#039;;&lt;br /&gt;
 end quadrat;&lt;br /&gt;
&lt;br /&gt;
 // Anwenden der Funktionen auf eine Liste:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;werte&amp;#039;&amp;#039; = (1, 2, 3, 4);&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;doppelte_Werte&amp;#039;&amp;#039;   = &amp;#039;&amp;#039;&amp;#039;apply_to&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;&amp;#039;verdoppeln&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;werte&amp;#039;&amp;#039;); //ergibt (2, 4, 6, 8)&lt;br /&gt;
 &amp;#039;&amp;#039;quadrierte_Werte&amp;#039;&amp;#039; = &amp;#039;&amp;#039;&amp;#039;apply_to&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;&amp;#039;quadrat&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;werte&amp;#039;&amp;#039;);    //ergibt (1, 4, 9, 16)&lt;br /&gt;
&lt;br /&gt;
Oder, kürzer, in [[Lambda-Kalkül|Lambda-Notation]]:&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;werte&amp;#039;&amp;#039; = (1, 2, 3, 4);&lt;br /&gt;
&lt;br /&gt;
 &amp;#039;&amp;#039;doppelte_Werte&amp;#039;&amp;#039;   = &amp;#039;&amp;#039;&amp;#039;apply_to&amp;#039;&amp;#039;&amp;#039;(lambda &amp;#039;&amp;#039;x&amp;#039;&amp;#039;: &amp;#039;&amp;#039;x&amp;#039;&amp;#039;*2, &amp;#039;&amp;#039;werte&amp;#039;&amp;#039;); //ergibt (2, 4, 6, 8)&lt;br /&gt;
 &amp;#039;&amp;#039;quadrierte_Werte&amp;#039;&amp;#039; = &amp;#039;&amp;#039;&amp;#039;apply_to&amp;#039;&amp;#039;&amp;#039;(lambda &amp;#039;&amp;#039;x&amp;#039;&amp;#039;: &amp;#039;&amp;#039;x&amp;#039;&amp;#039;*&amp;#039;&amp;#039;x&amp;#039;&amp;#039;, &amp;#039;&amp;#039;werte&amp;#039;&amp;#039;); //ergibt (1, 4, 9, 16)&lt;br /&gt;
&lt;br /&gt;
=== JavaScript ===&lt;br /&gt;
Rückrufe werden bei der Implementierung von [[Programmiersprache|Programmiersprachen]] wie [[JavaScript]] verwendet, einschließlich der Unterstützung von JavaScript-Funktionen als Rückrufe über js-ctypes und in Komponenten wie addEventListener.&lt;br /&gt;
&lt;br /&gt;
Im folgenden Beispiel wird zunächst eine Funktionsberechnung mit einem für den Rückruf bestimmten [[Parameter (Informatik)|Parameter]] definiert: &amp;#039;&amp;#039;rueckruffunktion&amp;#039;&amp;#039;. Dann wird eine [[Funktion (Programmierung)|Funktion]] definiert, die als Rückruf zur Berechnung verwendet werden kann: &amp;#039;&amp;#039;berechneSumme&amp;#039;&amp;#039;. Für &amp;#039;&amp;#039;rueckruffunktion&amp;#039;&amp;#039; können andere Funktionen verwendet werden, z. B. &amp;#039;&amp;#039;berechneProdukt&amp;#039;&amp;#039;. In diesem Beispiel wird &amp;#039;&amp;#039;berechne(...)&amp;#039;&amp;#039; zweimal aufgerufen, einmal mit &amp;#039;&amp;#039;berechneSumme&amp;#039;&amp;#039; als Rückruf und einmal mit &amp;#039;&amp;#039;berechneProdukt&amp;#039;&amp;#039;. Die Funktionen geben das Summe bzw. Produkt die zurück, und die Warnung zeigt sie auf dem Bildschirm an.&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function berechne(zahl1, zahl2, rueckruffunktion)&lt;br /&gt;
{&lt;br /&gt;
    return rueckruffunktion(zahl1, zahl2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function berechneSumme(zahl1, zahl2)&lt;br /&gt;
{&lt;br /&gt;
    return zahl1 + zahl2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function berechneProdukt(zahl1, zahl2)&lt;br /&gt;
{&lt;br /&gt;
    return zahl1 * zahl2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Gibt 20, die Summe von 5 and 15, aus&lt;br /&gt;
alert(berechne(5, 15, berechneSumme));&lt;br /&gt;
&lt;br /&gt;
// Gibt 75, das Produkt von 5 und 15, aus&lt;br /&gt;
alert(berechne(5, 15, berechneProdukt));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript verfügt über etliche vordefinierte Instanzmethoden mit einer Rückruffunktion als Parameter, unter anderem &amp;lt;code&amp;gt;Array.prototype.every()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.findIndex()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.findLast()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.findLastIndex()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.flatMap()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.forEach()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.map()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.reduce()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.reduceRight()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.some()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Array.prototype.sort()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Window.requestAnimationFrame()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Window.setInterval()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Window.setTimeout()&amp;lt;/code&amp;gt;. Von diesen wird nachfolgend &amp;lt;code&amp;gt;Array.prototype.reduce()&amp;lt;/code&amp;gt; exemplarisch herangezogen, um ein Array [[Iteration|iterativ]] auf ein einzelnes Ergebnis zu reduzieren, und dabei mittels einer [[JavaScript#Erzeugung|Pfeilfunktion]] konkretisiert, wie dies für ein Wertepaar geschehen soll (beispielsweise durch Anwendung einer Zeichenketten-, Rechen- oder anderweitigen Operation). Wird der [[Methode (Programmierung)|Methode]] zudem ein zweites [[Argument (Informatik)|Argument]] mitgegeben (wie etwa Null, eine leere [[Zeichenkette]] oder ein leeres [[Array (Datentyp)|Array]]), so wird es als initialer Startwert der [[Iteration]] verwendet, andernfalls das erste Element des Arrays. Der zugrundeliegende Algorithmus ist weiter unten im [[#PowerShell|PowerShell-Beispiel]] skizziert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function f(s) { console.log(s) }&lt;br /&gt;
const array = [2, 5, 1, 3]; // Erzeugt ein Array mit 4 Elementen =&amp;gt; 2,5,1,3&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; a + b)); // Berechnet Summe =&amp;gt; 11&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; a * b)); // Berechnet Produkt =&amp;gt; 30&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; a)); // Gibt erstes Element zurück =&amp;gt; 2&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; b)); // Gibt letztes Element zurück =&amp;gt; 3&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; Math.min(a, b))); // Bestimmt Minimum =&amp;gt; 1&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; Math.max(a, b))); // Bestimmt Maximum =&amp;gt; 5&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; `${a}${b}`)); // Bewirkt Konkatenation =&amp;gt; &amp;#039;2513&amp;#039;&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; a + b, &amp;#039;&amp;#039;)); // Bewirkt Konkatenation =&amp;gt; &amp;#039;2513&amp;#039;&lt;br /&gt;
f(array.reduce(a =&amp;gt; a + 1, 0)); // Zählt Elemente =&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
// Der Rückgabewert kann durchaus wieder ein Array sein:&lt;br /&gt;
&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; (a.push(b), a), [])); // Kopie =&amp;gt; 2,5,1,3&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; (a.unshift(b), a), [])); // Umkehrung =&amp;gt; 3,1,5,2&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; (a.push(b * b), a), [])); // Quadrierung =&amp;gt; 4,25,1,9&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; (a.push(b + b), a), [])); // Verdopplung =&amp;gt; 4,10,2,6&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; (a.push(`${b}${b}`), a), [])); // Dopplung =&amp;gt; &amp;#039;22&amp;#039;,&amp;#039;55&amp;#039;,&amp;#039;11&amp;#039;,&amp;#039;33&amp;#039;&lt;br /&gt;
f(array.reduce((a, b) =&amp;gt; (b &amp;gt; 2 &amp;amp;&amp;amp; a.push(b), a), [])); // Filterung (auf größer 2) =&amp;gt; 5,3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C# ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
public class Hauptklasse &lt;br /&gt;
{&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
        Nebenklasse objekt = new Nebenklasse();&lt;br /&gt;
        &lt;br /&gt;
        // Ruft die Methode von Nebenklasse mit Rückruffunktion als Parameter auf&lt;br /&gt;
        objekt.Aufrufmethode(Rueckruffunktion);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Diese Rückruffunktion gibt den im Rückruf angegebenen Text aus&lt;br /&gt;
    static void Rueckruffunktion(string text)&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Der Rückruf lautet:&amp;quot; + text);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Nebenklasse&lt;br /&gt;
{&lt;br /&gt;
    // Diese Methode hat eine andere Methode als Parameter und ruft diese auf&lt;br /&gt;
    public void Aufrufmethode(Action&amp;lt;string&amp;gt; rueckruf)&lt;br /&gt;
    {&lt;br /&gt;
        // Ruft die Methode Rueckruffunktion in Hauptklasse mit der der angegebenen Textnachricht aus&lt;br /&gt;
        rueckruf(&amp;quot;Ich komme sofort zurück.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
In [[PowerShell]] lassen sich Skriptblöcke nicht nur in Cmdlets wie &amp;lt;code&amp;gt;Register-ScheduledJob&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Set-ScheduledJob&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Start-Job&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Invoke-Command&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ForEach-Object&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Where-Object&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Select-Object&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Format-List&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Format-Table&amp;lt;/code&amp;gt; einsetzen, um (innerhalb einer [[Pipe (Informatik)|Pipeline]]) ausgeführt zu werden oder mittels ihnen berechnete Objekteigenschaften ({{enS|&amp;#039;&amp;#039;calculated property&amp;#039;&amp;#039;}}) zu bestimmen, sondern auch (parametrisiert) als [[Anonyme Funktion|anonyme Funktionen]] gebrauchen.&lt;br /&gt;
&lt;br /&gt;
Nachfolgend ist die Funktion &amp;lt;code&amp;gt;Reduce-Array&amp;lt;/code&amp;gt; ganz allgemein dazu in der Lage, ein [[Array (Datentyp)|Array]] auf einen einzigen Wert zu reduzieren. Wie dies konkret geschehen soll (beispielsweise per [[Konkatenation (Wort)|Konkatenation]], Summenbildung, Produktbildung oder Rückgabe des ersten, letzten, kleinsten oder größten Elements), wird mittels einer Rückruffunktion spezifiziert, die zwei Werte entgegennimmt und einen zurückliefert. Durch deren [[Iteration|iterative]] Anwendung lässt sich eine mehrelementige Eingabe letztlich zu einem einzelnen Ergebnis verdichten. Optional kann der Funktion &amp;lt;code&amp;gt;Reduce-Array&amp;lt;/code&amp;gt; als weiteres Argument ein initialer Startwert mitgegeben werden, wie etwa Null, eine leere [[Zeichenkette]] oder ein leeres [[Array (Datentyp)|Array]].&amp;lt;ref&amp;gt;{{Internetquelle |url=http://mawe-web.de/powershell.html#callback |titel=Anonyme Funktionen und Rückruffunktionen |abruf=2025-03-06}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
function Reduce-Array {&lt;br /&gt;
  param ([Array]$Array = @(), [ScriptBlock]$Callback = {}, $Value)&lt;br /&gt;
  [Int]$i = $null -eq $Value&lt;br /&gt;
  if ($i -and $Array.Count) { # Wenn weder Initialwert übergeben noch Array leer, ...&lt;br /&gt;
    $Value = $Array[0] # ... dann erstes Element als Initialwert verwenden&lt;br /&gt;
  }&lt;br /&gt;
  while ($i -lt $Array.Count) { # (Übrige) Elemente durchlaufen ...&lt;br /&gt;
    $Value = &amp;amp;$Callback $Value $Array[$i++] # ... und jeweils Rückruffunktion anwenden&lt;br /&gt;
  }&lt;br /&gt;
  $Value&lt;br /&gt;
}&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) $x + $y } # Berechnet Summe =&amp;gt; 11&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) $x * $y } # Berechnet Produkt =&amp;gt; 30&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) $x } # Gibt erstes Element zurück =&amp;gt; 2&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) $y } # Gibt letztes Element zurück =&amp;gt; 3&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) [Math]::Min($x, $y) } # Bestimmt Minimum =&amp;gt; 1&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) [Math]::Max($x, $y) } # Bestimmt Maximum =&amp;gt; 5&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) [String]$x + $y } # Bewirkt Konkatenation =&amp;gt; &amp;quot;2513&amp;quot;&lt;br /&gt;
Reduce-Array &amp;quot;2&amp;quot;,&amp;quot;5&amp;quot;,&amp;quot;1&amp;quot;,&amp;quot;3&amp;quot; { param($x, $y) $x + $y } # Bewirkt Konkatenation =&amp;gt; &amp;quot;2513&amp;quot;&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x, $y) $x + $y } &amp;quot;&amp;quot; # Bewirkt Konkatenation =&amp;gt; &amp;quot;2513&amp;quot;&lt;br /&gt;
Reduce-Array 2,5,1,3 { param($x) $x + 1 } 0 # Zählt Elemente =&amp;gt; 4&lt;br /&gt;
&lt;br /&gt;
# Der Rückgabewert kann durchaus wieder ein Array sein:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;Original =&amp;gt; 2,5,1,3&amp;#039;&lt;br /&gt;
 2,5,1,3 | ConvertTo-Json&lt;br /&gt;
&amp;#039;Kopie =&amp;gt; 2,5,1,3&amp;#039;&lt;br /&gt;
 Reduce-Array 2,5,1,3 { param($x, $y) @($x) + $y } | ConvertTo-Json&lt;br /&gt;
&amp;#039;Umkehrung =&amp;gt; 3,1,5,2&amp;#039;&lt;br /&gt;
 Reduce-Array 2,5,1,3 { param($x, $y) @($y) + $x } | ConvertTo-Json&lt;br /&gt;
&amp;#039;Quadrierung =&amp;gt; 4,25,1,9&amp;#039;&lt;br /&gt;
 Reduce-Array 2,5,1,3 { param($x, $y) @($x) + $y * $y } @() | ConvertTo-Json&lt;br /&gt;
&amp;#039;Verdopplung =&amp;gt; 4,10,2,6&amp;#039;&lt;br /&gt;
 Reduce-Array 2,5,1,3 { param($x, $y) @($x) + $y * 2 } @() | ConvertTo-Json&lt;br /&gt;
&amp;#039;Verdopplung =&amp;gt; &amp;quot;22&amp;quot;,&amp;quot;55&amp;quot;,&amp;quot;11&amp;quot;,&amp;quot;33&amp;quot;&amp;#039;&lt;br /&gt;
 Reduce-Array &amp;quot;2&amp;quot;,&amp;quot;5&amp;quot;,&amp;quot;1&amp;quot;,&amp;quot;3&amp;quot; { param($x, $y) @($x) + $y * 2 } @() | ConvertTo-Json&lt;br /&gt;
&amp;#039;Verdopplung =&amp;gt; &amp;quot;22&amp;quot;,&amp;quot;55&amp;quot;,&amp;quot;11&amp;quot;,&amp;quot;33&amp;quot;&amp;#039;&lt;br /&gt;
 Reduce-Array 2,5,1,3 { param($x, $y) @($x) + [String]$y * 2 } @() | ConvertTo-Json&lt;br /&gt;
&amp;#039;Filterung (auf Elemente größer 2) =&amp;gt; 5,3&amp;#039;&lt;br /&gt;
 Reduce-Array 2,5,1,3 { param($x, $y) @($x) + (@($y) -gt 2) } @() | ConvertTo-Json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PHP ===&lt;br /&gt;
&amp;#039;&amp;#039;[[PHP]]&amp;#039;&amp;#039; verfügt über vordefinierte Array-Funktionen, denen eine Rückruffunktion als [[Parameter (Informatik)|Argument]] übergeben werden kann, unter anderem &amp;lt;code&amp;gt;array_all()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_any()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_filter()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_find()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_map()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_udiff()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_uintersect()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array_walk()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;uasort()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;uksort()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;usort()&amp;lt;/code&amp;gt;. Dazu gehört auch &amp;lt;code&amp;gt;array_reduce()&amp;lt;/code&amp;gt;, welche durch [[Iteration|iteratives]] Vorgehen ein Array auf ein einzelnes Ergebnis reduziert und deren Wirkungsweise nachfolgend demonstriert wird. Soll dabei nicht &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; als (neutraler) Anfangswert für die Iteration dienen, muss über einen optionalen dritten Parameter etwas anderes festgelegt werden, beispielsweise &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; für additive, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; für multiplikative oder &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt; für konkatenierende Operationen.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
  $werte = array(2, 5, 1, 3); // Array mit 4 Elementen&lt;br /&gt;
  $anzahl = function ($carry) { return $carry + 1; };&lt;br /&gt;
  $summe = function ($carry, $item) { return $carry + $item; };&lt;br /&gt;
  $produkt = function ($carry, $item) { return $carry * $item; };&lt;br /&gt;
  $konkatenation = function ($carry, $item) { return $carry . $item; };&lt;br /&gt;
  echo array_reduce($werte, $anzahl, 0), &amp;quot;\n&amp;quot;; // Zählt die Elemente =&amp;gt; 4&lt;br /&gt;
  echo array_reduce($werte, $summe), &amp;quot;\n&amp;quot;; // Summiert die Elemente =&amp;gt; 11&lt;br /&gt;
  echo array_reduce($werte, $produkt, 1), &amp;quot;\n&amp;quot;; // Multipliziert die Elemente =&amp;gt; 30&lt;br /&gt;
  echo array_reduce($werte, $konkatenation), &amp;quot;\n&amp;quot;; // Konkateniert die Elemente =&amp;gt; &amp;quot;2513&amp;quot;&lt;br /&gt;
  echo $konkatenation($konkatenation($konkatenation(2, 5), 1), 3), &amp;quot;\n&amp;quot;; // dto. =&amp;gt; &amp;quot;2513&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  // Der Rückgabewert kann durchaus wieder ein Array sein:&lt;br /&gt;
&lt;br /&gt;
  $kopie = function ($carry, $item) { array_push($carry, $item); return $carry; };&lt;br /&gt;
  $umkehrung = function ($carry, $item) { array_unshift($carry, $item); return $carry; };&lt;br /&gt;
  $verdopplung = function ($carry, $item) { array_push($carry, $item * 2); return $carry; };&lt;br /&gt;
  $quadrierung = function ($carry, $item) { array_push($carry, $item ** 2); return $carry; };&lt;br /&gt;
  function filterung($carry, $item) { $item &amp;gt; 2 &amp;amp;&amp;amp; array_push($carry, $item); return $carry; }&lt;br /&gt;
  function dump($var) { print_r($var) /* oder var_dump($var) oder var_export($var) */; }&lt;br /&gt;
  dump(array_reduce($werte, $kopie, [])); // Kopie des Arrays =&amp;gt; [2, 5, 1, 3]&lt;br /&gt;
  dump(array_reduce($werte, $umkehrung, [])); // Umkehrung der Elemente =&amp;gt; [3, 1, 5, 2]&lt;br /&gt;
  dump(array_reduce($werte, $verdopplung, [])); // Verdopplung jedes Elements =&amp;gt; [4, 10, 2, 6]&lt;br /&gt;
  dump(array_reduce($werte, $quadrierung, [])); // Quadrierung jedes Elements =&amp;gt; [4, 25, 1, 9]&lt;br /&gt;
  dump(array_reduce($werte, &amp;quot;filterung&amp;quot;, [])); // Filterung (auf Elemente größer 2) =&amp;gt; [5, 3]&lt;br /&gt;
  dump(filterung(filterung(filterung(filterung([], 2), 5), 1), 3)); // dto. =&amp;gt; [5, 3]&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Hook (Informatik)]]&lt;br /&gt;
* [[Signal-Slot-Konzept]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Webarchiv |url=http://www.phpblogger.net/2008/10/17/hook-und-callback-funktionen-teil-3/ |wayback=20081020051304 |text=Hook- und Callback-Funktionen mit PHP}} (deutsches Tutorial)&lt;br /&gt;
* [https://javascript.info/callbacks Einführung in Rückruffunktionen mit JavaScript]&lt;br /&gt;
* [https://www.geeksforgeeks.org/javascript-callbacks/ JavaScript | Callbacks]&lt;br /&gt;
* [https://docs.microsoft.com/en-us/dotnet/framework/interop/how-to-implement-callback-functions How to: Implement Callback Functions] (Microsoft Docs)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Ruckruffunktion}}&lt;br /&gt;
[[Kategorie:Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Siegbert v2</name></author>
	</entry>
</feed>