Ich bleibe bei diesem Konzept von 'Funktionen, die Funktionen zurückgeben'. Ich beziehe mich auf das Buch 'Object Oriented Javascript' von Stoyan Stefanov.
Snippet One:
function a() {
alert('A!');
function b(){
alert('B!');
}
return b();
}
var s = a();
alert('break');
s();
Ausgabe:
A!
B!
break
Snippet Zwei
function a() {
alert('A!');
function b(){
alert('B!');
}
return b;
}
var s = a();
alert('break');
s();
A!
break
B!
Kann mir bitte jemand den Unterschied zwischen der Rückkehr b
und b()
den obigen Ausschnitten erklären?
javascript
Cafecorridor
quelle
quelle
Antworten:
Durch Zuweisen einer Variablen zu einer Funktion (ohne Klammer) wird der Verweis auf die Funktion kopiert. Wenn Sie die Klammer an das Ende eines Funktionsnamens setzen, wird die Funktion aufgerufen und der Rückgabewert der Funktionen zurückgegeben.
Demo
In Ihrem Beispiel definieren Sie auch Funktionen innerhalb einer Funktion. Sowie:
Die Funktion ist weiterhin aufrufbar. Es existiert noch. Dies wird ständig in JavaScript verwendet. Funktionen können herumgereicht werden , nur wie andere Werte. Folgendes berücksichtigen:
Die Funktionsanzahl kann die Variablen, die außerhalb definiert wurden, beibehalten. Dies wird als Schließung bezeichnet. Es wird auch häufig in JavaScript verwendet.
quelle
this
bedeutet nur etwas innerhalb eines Funktionskörpers, sonst ist es global. Was Sie sagen,this.sayName
ist, dass Sie die globale Variable wollen,sayName
die nicht existiert, sie ist undefiniert und daher nicht aufrufbar.Wenn Sie den Funktionsnamen ohne
()
zurückgeben, wird ein Verweis auf die Funktion zurückgegeben, der wie gewünscht zugewiesen werden kannvar s = a()
.s
Enthält jetzt einen Verweis auf die Funktionb()
, und das Aufrufens()
entspricht funktional dem Aufrufenb()
.Wenn Sie die Funktion mit
()
in einer return-Anweisung aufrufen, wird die Funktion ausgeführt und der von der Funktion zurückgegebene Wert zurückgegeben. Es ähnelt dem Aufrufenvar x = b();
, aber anstatt den Rückgabewert vonb()
Ihnen zuzuweisen, geben Sie ihn von der aufrufenden Funktion zurücka()
. Wenn die Funktionb()
selbst keinen Wert zurückgibt, wird der Aufrufundefined
nach allen anderen Arbeiten zurückgegebenb()
.quelle
return b();
ruft die Funktion b () auf und gibt das Ergebnis zurück.return b;
Gibt einen Verweis auf die Funktion b zurück, die Sie in einer Variablen speichern können, um sie später aufzurufen.quelle
Beim Zurückgeben
b
wird ein Funktionsobjekt zurückgegeben. In Javascript sind Funktionen wie jedes andere Objekt nur Objekte. Wenn Sie das nicht hilfreich finden, ersetzen Sie einfach das Wort "Objekt" durch "Ding". Sie können jedes Objekt von einer Funktion zurückgeben. Sie können einen True / False-Wert zurückgeben. Eine ganze Zahl (1,2,3,4 ...). Sie können eine Zeichenfolge zurückgeben. Sie können ein komplexes Objekt mit mehreren Eigenschaften zurückgeben. Und Sie können eine Funktion zurückgeben. Eine Funktion ist nur eine Sache.In Ihrem Fall
b
gibt die Rückgabe das Ding zurück, das Ding ist eine aufrufbare Funktion. Rückgabeb()
gibt den von der aufrufbaren Funktion zurückgegebenen Wert zurück.Betrachten Sie diesen Code:
Unter Verwendung der obigen Definition wird
return b();
der Wert 42 zurückgegeben. Andererseits wirdreturn b;
eine Funktion zurückgegeben, die selbst den Wert 42 zurückgibt. Dies sind zwei verschiedene Dinge.quelle
42
;)Wenn Sie zurückkehren
b
, ist dies nur ein Verweis auf Funktion b, wird jedoch zu diesem Zeitpunkt nicht ausgeführt.Wenn Sie zurückkehren
b()
, führen Sie die Funktion aus und geben ihren Wert zurück.Versuchen
alert
Sie estypeof(s)
in Ihren Beispielen. Snippet b gibt Ihnen 'Funktion'. Was wird dir ein Schnipsel geben?quelle
s
. Versuchen Sie esreturn this
stattreturn b
... Sie werden ess.b()
dann tun können ;)Stellen Sie sich die Funktion als Typ vor, wie einen Int. Sie können Ints in einer Funktion zurückgeben. Sie können auch Funktionen zurückgeben, sie sind Objekte vom Typ "Funktion".
Nun das Syntaxproblem: Da Funktionen Werte zurückgeben, wie können Sie eine Funktion zurückgeben und nicht einen Wert?
durch Weglassen von Klammern! Denn ohne Klammern wird die Funktion nicht ausgeführt! So:
Gibt die "Funktion" zurück (stellen Sie sich vor, Sie geben eine Zahl zurück), während:
Führt zuerst die Funktion aus und gibt dann den Wert zurück, der durch Ausführen erhalten wurde. Das ist ein großer Unterschied!
quelle
Erstellen Sie eine Variable :
Deklarieren Sie eine Funktion :
Benachrichtigen Sie den Wert von
thing1
(unserer ersten Variablen):Wenn wir
thing1
nun ein Verweis auf die Funktion sein wolltensomething1
, was bedeutet, dass es dasselbe ist wie unsere erstellte Funktion, würden wir Folgendes tun:Wenn wir jedoch den
return
Wert der Funktion wollen, müssen wir ihm den Rückgabewert der ausgeführten Funktion zuweisen. Sie führen die Funktion in Klammern aus:quelle
Ausschnitt eins:
Die Anweisung 'b ()' bedeutet, die Funktion 'b' auszuführen, die ein Dialogfeld mit dem Text 'B!' zeigt.
die Aussage 'return b ();' bedeutet, eine Funktion mit dem Namen 'b' auszuführen und dann zurückzugeben, welche Funktion 'b' zurückgibt. aber 'b' gibt nichts zurück, dann gibt diese Anweisung 'return b ()' auch nichts zurück. Wenn b () eine Zahl zurückgibt, ist 'return b ()' auch eine Zahl.
Jetzt wird 's' der Wert von 'a ()' zurückgegeben, was 'b ()' zurückgibt, was nichts ist, also ist 's' nichts (in JavaScript ist es tatsächlich eine Sache, es ist eine 'undefinierte'. Also Wenn Sie JavaScript bitten, den Datentyp 's' zu interpretieren, teilt Ihnen der JavaScript-Interpreter mit, dass 's' undefiniert ist.) Da 's' undefiniert ist, wenn Sie JavaScript bitten, diese Anweisung 's ()' auszuführen, Sie fordern JavaScript auf, eine Funktion mit dem Namen 's' auszuführen, aber 's' ist hier eine 'undefinierte', keine Funktion, daher beschwert sich JavaScript: "Hey, s ist keine Funktion, ich weiß nicht wie Um dies zu tun s ", wird eine Fehlermeldung" Uncaught TypeError: s ist keine Funktion "von JavaScript angezeigt (getestet in Firefox und Chrome).
Snippet Zwei
Jetzt gibt die Funktion 'a' einen Zeiger / Alias auf eine Funktion mit dem Namen 'b' zurück. Wenn also 's = a ()' ausgeführt wird, erhält 's' einen Wert, der auf b zeigt, dh 's' ist jetzt ein Alias von 'b'. Der Aufruf von 's' entspricht dem Aufruf von 'b'. dh 's' ist jetzt eine Funktion. Execute 's ()' bedeutet, dass die Funktion 'b' ausgeführt wird (wie beim Ausführen von 'b ()'), einem Dialogfeld mit 'B!' wird angezeigt (dh Ausführen der 'alert (' B! '); Anweisung in der Funktion' b ')
quelle
Dies ist im wirklichen Leben sehr nützlich.
Arbeiten mit Express.js
Ihre reguläre
express
Route sieht also so aus:Aber was ist, wenn Sie einen Wrapper, einen Fehlerhandler oder etwas hinzufügen müssen?
Dann rufen Sie Ihre Funktion über einen Wrapper auf.
Sieht kompliziert aus? Wie wäre es damit:
Sehen Sie am Ende, dass Sie eine Funktion
loggingWrapper
mit einem Argument als eine andere Funktion übergebenitWorksHandler
undloggingWrapper
eine neue Funktion zurückgeben, diereq, res, next
als Argumente verwendet wird.quelle