Beim Aufrufen einer Funktion mit leeren Klammern oder ohne Klammern ist mir ein Unterschied aufgefallen. Da ich jedoch keine Argumente an die Funktion übergebe, habe ich mich gefragt, was der Unterschied sein würde zwischen:
window.onload = initAll();
und
window.onload = initAll;
Bitte erläutern Sie das Prinzip dahinter.
javascript
Dean
quelle
quelle
(
LINKE PARENTHESE = Klammer öffnen (1.0) und 0029)
RECHTE PARENTHESE = Klammer schließen (1.0) - unicode.org/charts/charindex.html#P und was Dictionary.com dazu zu sagen hat - dictionary.reference.com/ browse / PARENTHESIS "Eine oder beide der aufrecht gekrümmten Linien, () ..."{}
werden Eichhörnchenklammern genannt.Antworten:
Dies wird
initAll()
sofort ausgeführt und weist den Rückgabewert der Funktion zuwindow.onload
. Dies ist normalerweise nicht das, was Sie wollen.initAll()
müsste eine Funktion zurückgeben, damit dies Sinn macht.Dies weist die eigentliche Funktion zu
window.onload
- dies ist möglich, weil in JavaScript, wie @Felix sagt, Funktionen erstklassige Objekte sind - ohne sie auszuführen.initAll
wird vom Ladeereignis ausgeführt.quelle
Was Pekka sagt, ist richtig, aber ich möchte ein wenig mit einem Beispiel näher darauf eingehen, das jemandem helfen wird, der Funktionszeiger oder Delegierte nicht vollständig versteht.
Ich werde nicht verwenden,
window.onload
weil das ein bisschen erfunden ist, um zu demonstrieren. Ich werde stattdessen eine einfache Multiplikationsfunktion verwenden, um zu demonstrieren:Dies könnte ebenso geschrieben werden:
Während im ersten Beispiel die Implikation möglicherweise nicht offensichtlich ist, zeigt das zweite Beispiel deutlicher, dass wir einer Variablen namens eine Funktion mit zwei Parametern zuweisen
Multiply
, und dieses Konzept von Funktionen als Zuweisungen ist in JavaScript üblich. Dies ist eine kleine Demonstration der Tatsache, dass Funktionen "Bürger erster Klasse" sind , das heißt, sie können genau so weitergegeben werden, als würden wir Werte weitergeben.Nun also zum Unterschied der Zuordnung:
Zum Zeitpunkt der Definition der Ret-Variablen
Multiply
wird ausgeführt und der Rückgabewert zugewiesen -ret
wird gleich 12.Versuchen wir das noch einmal anders:
Nun, an der Stelle definiert
ret
,ret
wird IhreMultiply
Funktion im Gegensatz zu dem aus dem erhaltenen Ergebnis,Multiply
Funktion. Durch Aufrufe vonret()
wird IhreMultiply
Funktion ausgeführt, und Sie können sie genau so aufrufen, als hätten Sie Folgendes aufgerufenMultiply(operator, operand)
:ist das gleiche wie
Sie haben effektiv gesagt, dass Sie
ret
als Delegierter für verwenden werdenMultiply()
. Beim Aufrufret
beziehen wir uns wirklich auf dieMultiply
Funktion.Zurück zu deinem
window.onload
. Stellen Sie sich das vor als:Wie Sie sehen können,
window.onload
ist eine Funktion wie jede andere Funktion nichts Besonderes. Sie können ihm einen Wert zuweisen, ihm eine Funktion zuweisen, ihn auf Wunsch auf Null setzen - der Punkt ist, dass es nichts Besondereswindow.onload
gibt als Ihre eigene Funktion. Das einzig etwas andere ist, dass es beim Laden vom Fenster aufgerufen wird. [Haftungsausschluss: Ich habe Fensterfunktionen nie auf Null gesetzt, daher bin ich mir nicht sicher, ob dies negative Auswirkungen haben wird. Man würde hoffen, dass sie prüfen, ob eine Funktion zugewiesen ist, bevor sie aufgerufen werden, dhif (window.onload) window.onload();
].Jetzt nennen
initAll()
wir: Wir sagen:was genauso gut sagen könnte:
Aber wenn wir sagen ,
initAll
ohne Klammern, sind , was wir wirklich sagen will , ist: Ich möchte zu ersetzen , was meine window.onload Funktion ist, mit einer neuen Funktion - also ich es mit meinem ersetzen wolleninitAll
Funktion, so dass alle Anrufewindow.onload
läuft meininitAll
Code.So:
wird ersetzt durch:
Jeder Aufruf von
window.onload
führt also IhreinitAll
Funktion aus, anstatt waswindow.onload
ursprünglich war. Sie haben die ursprüngliche Funktion durch Ihre neue Funktion ersetzt.In der Tat könnten Sie gleichermaßen schreiben:
Ein weiteres Beispiel, das möglicherweise besser demonstriert, ist Folgendes:
Was auch immer die Zeit zu der Zeit war, die
d
definiert ist, wird zugewiesencurrentTime
. Großartig, aber das ist nur nützlich, wenn wir herausfinden möchten, wann die Funktion, die diesen Code enthält, aufgerufen wurde - dh zum Zeitpunkt des Ladens der Seite. Was ist, wenn wir die aktuelle Zeit jederzeit anzeigen möchtencurrentTime
?Beachten Sie, wie wir
b()
unserec
undd
Aufgaben genau so anrufen, wie wir anrufen könntencurrentTime()
?quelle
Funktionen in Javascript sind erstklassige Bürger und können als solche anderen Variablen zugewiesen oder als Argumente weitergegeben werden.
Also, wenn du es tust
Sie legen die
onload
Eigenschaft deswindow
Objekts fest, um auf dieinitAll
Funktion selbst zu verweisen .Wenn Sie das tun
Sie legen die
onload
Eigenschaft so fest, dass sie den Rückgabewert von initAll enthält, da sie in dieser Zeile ausgeführt wird.quelle
initAll
ist eine Referenz auf einen Funktionswert, und der an den Funktionsnamen angehängte Operator in Klammern führt dieses Funktionsobjekt aus.Also, wenn Sie so etwas tun
dann
a
wird das gleiche wieinitAll
- zum Beispiel können Siea()
- aber mitDie Variable
a
erhält den Rückgabewert der ausgeführteninitAll
Funktionquelle
Ich bin 6 Jahre zu spät, aber ich denke, das hätte viel einfacher erklärt werden können als die obigen Antworten.
Also hier ist der TLDR ; oder Vogelperspektive beim Aufrufen von Funktionen mit und ohne Verwendung von
()
'sNehmen wir zum Beispiel diese Funktion:
wenn du "foo" loggst - ohne
()
Verwenden Sie keine
()
Mittel, um die Funktion selbst abzurufen . Sie würden dies tun, wenn Sie möchten, dass es als Rückruf weitergegeben wird.wenn Sie "foo ()" anmelden - mit
()
Unter Verwendung
()
nach Funktionsmittel , die Funktion auszuführen und seinen Wert zurückgeben .quelle