Callback-Funktion
Die Callback-Funktion ist für Programmieranfänger möglicherweise etwas schwer zu verstehen. Schließlich steht die Verwendung der Callback-Funktion im Widerspruch zum intuitiven Programmablauf Sequenzausführung.
Stellen Sie sich vor, Sie bestellen ein Essen zum Mitnehmen. Eine Möglichkeit besteht darin, zu überprüfen, ob das Essen zum Mitnehmen regelmäßig angekommen ist, oder die andere Möglichkeit besteht darin, dem Zusteller Ihre Telefonnummer zu zeigen, und er wird Sie anrufen, wenn es eintrifft.
Es ist leicht zu erkennen, dass die zweite Lösung eine effizientere Lösung ist. Wenn dieser Benachrichtigungsmechanismus auf das Programmierfeld angewendet wird, handelt es sich tatsächlich um eine Rückruffunktion.
Studenten, die mit der Win32-Entwicklung vertraut sind, sollten wissen, dass ein typisches Windows-Programm-Framework eine Nachrichtenschleife und eine Fensterprozedurfunktion ist. Das Windows-System übernimmt die Nachrichtenannahme und ruft dann die Fensterprozedurfunktion des Entwicklers auf, um die spezifische Nachrichtenverarbeitungslogik abzuschließen. Die Fensterprozedurfunktion ist eine Rückruffunktion.
Warum eine Rückruffunktion benötigt wird
Nehmen Sie das obige Win32-Programm als Beispiel. Wir wissen, dass das Windows-Betriebssystem Entwicklern aus Sicherheitsgründen keinen direkten Zugriff auf Hardwareressourcen erlaubt. Microsoft-Entwickler stellen eine API zur Verarbeitung der Nachrichtenschleife bereit, die Antwortlogik für bestimmte Nachrichten muss jedoch vom Entwickler bereitgestellt werden. In diesem Fall ist die Rückruffunktion eine gute Implementierungslösung.
Um ein weiteres Beispiel zu nennen: Stellen Sie sich vor, Sie sind an der Entwicklung eines Softwareprojekts für die Geräteverwaltung von Mobiltelefonen beteiligt und für das zugrunde liegende Gerätekommunikationsmodul verantwortlich. Wenn der Benutzer das Gerät in den Computer einfügt, müssen Sie das Modul der oberen Ebene benachrichtigen, um es zu verarbeiten. Aus Gründen der Flexibilität und Vielseitigkeit können Sie die Verarbeitungslogik nicht in das Modul einfügen, für das Sie verantwortlich sind. Zu diesem Zeitpunkt kann der Aufrufer der oberen Ebene eine Rückruffunktion bereitstellen und Ihr Modul aufrufen die Rückruffunktion, wenn das Gerät angeschlossen ist.
Bei den Rückruffunktionen gibt es ein sogenanntes Hollywood-Kriterium: Rufen Sie mich nicht an, ich rufe Sie an!
Anonyme Funktion
Wenn Sie in C, C und anderen Sprachen eine Rückruffunktion verwenden müssen, müssen Sie einen Funktionskörper vordefinieren. Die Callback-Funktion wird in der Regel nur für Aufrufe anderer Module bereitgestellt. Um die Codierung zu vereinfachen, bieten nachfolgende Skriptsprachen wie JavaScript Unterstützung für anonyme Funktionen. (Hinweis: Der neue C-Standard unterstützt auch anonyme Funktionen, sogenannte Lambda-Funktionen)
getUserInfo:function(cb){ var that = this if(this.globalData.userInfo){ typeof cb == "function" && cb(this.globalData.userInfo) }else{ //调用登录接口 wx.login({ success: function () { wx.getUserInfo({ success: function (res) { that.globalData.userInfo = res.userInfo typeof cb == "function" && cb(that.globalData.userInfo) } }) } }) } },
Der obige Code stammt aus app.js im vorherigen Tutorial. Übergeben Sie beim Aufruf von wx.login eine anonyme Funktion Die Funktion wird verwendet, um eine logische Verarbeitung durchzuführen, nachdem der Aufruf erfolgreich war. Dies ist der Teil nach dem Erfolg. Sie sehen, dass es nur eine Funktionsdefinition, aber keinen Funktionsnamen gibt, sodass die Funktion außer als Rückruffunktion nicht an anderer Stelle aufgerufen werden kann.
Tatsächlich stellen anonyme Funktionen nur eine Vereinfachung der Codierung dar, aber die Vorteile, die sie mit sich bringen, bestehen nicht nur in einer reduzierten Codierung.
Abschluss
In der Programmiertechnologie sollte der Abschluss eine fortschrittlichere Technologie sein. Bei der Verwendung von Rückruffunktionen ist in der Regel die Übergabe von Kontext erforderlich. In Sprachen wie c/c werden globale Variablen oder Heapspeicher zur Kontextübergabe verwendet. Die Nachteile globaler Variablen liegen auf der Hand und Heapspeicher ist anfällig für Speicherverluste. In fortgeschritteneren Skriptsprachen kann die Kontextübertragung einfach durch die Verschlusstechnologie erreicht werden.
Nehmen wir den obigen Code als Beispiel: that.globalData.userInfo = res.userInfo wird in der Rückruffunktion ausgeführt, um Benutzerinformationen zu speichern, wobei die Variable that durch var that = this zugewiesen wird, sodass die Variable zeigt zum App-Objekt selbst, sodass die Benutzerinformationen erfolgreich gespeichert werden können.
Wir können sehen, dass das Objekt „that“ eine Variable auf dem Methodenstapel „getUserInfo“ ist. Ohne Abschlusstechnologie kann die anonyme Rückruffunktion diese Variable hier nicht direkt verwenden, daher muss das App-Objekt an die Rückruffunktion übergeben werden (Globale Variablen oder Funktionsparameter) und mit der Unterstützung der Abschlusstechnologie kann die Rückruffunktion auf diese Variable zugreifen, genau wie bei der Verwendung interner Variablen der Funktion, was in der Syntax viel praktischer ist.