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.onloadweil das ein bisschen erfunden ist, um zu demonstrieren. Ich werde stattdessen eine einfache Multiplikationsfunktion verwenden, um zu demonstrieren:
function Multiply(operator, operand) {
return operator * operand;
}
Dies könnte ebenso geschrieben werden:
Multiply = function(operator, operand) {
return operator * operand;
}
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:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
Zum Zeitpunkt der Definition der Ret-Variablen Multiplywird ausgeführt und der Rückgabewert zugewiesen - retwird gleich 12.
Versuchen wir das noch einmal anders:
var operator = 3;
var operand = 4;
var ret = Multiply;
Nun, an der Stelle definiert ret, retwird Ihre MultiplyFunktion im Gegensatz zu dem aus dem erhaltenen Ergebnis, MultiplyFunktion. Durch Aufrufe von ret()wird Ihre MultiplyFunktion ausgeführt, und Sie können sie genau so aufrufen, als hätten Sie Folgendes aufgerufen Multiply(operator, operand):
var out = ret(3, 4);
ist das gleiche wie
var out = Multiply(3, 4);
Sie haben effektiv gesagt, dass Sie retals Delegierter für verwenden werden Multiply(). Beim Aufruf retbeziehen wir uns wirklich auf die MultiplyFunktion.
Zurück zu deinem window.onload. Stellen Sie sich das vor als:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
Wie Sie sehen können, window.onloadist 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 Besonderes window.onloadgibt 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, dh if (window.onload) window.onload();].
Jetzt nennen initAll()wir: Wir sagen:
window.onload = initAll();
was genauso gut sagen könnte:
window.onload = 12;
Aber wenn wir sagen , initAllohne 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 wollen initAllFunktion, so dass alle Anrufe window.onloadläuft mein initAllCode.
So:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
wird ersetzt durch:
window.onload = function() {
return 12;
}
Jeder Aufruf von window.onloadführt also Ihre initAllFunktion aus, anstatt was window.onloadursprünglich war. Sie haben die ursprüngliche Funktion durch Ihre neue Funktion ersetzt.
In der Tat könnten Sie gleichermaßen schreiben:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
Ein weiteres Beispiel, das möglicherweise besser demonstriert, ist Folgendes:
var d = new Date();
var currentTime = d.getTime();
Was auch immer die Zeit zu der Zeit war, die ddefiniert ist, wird zugewiesen currentTime. 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öchten currentTime?
var currentTime = function() {
var d = new Date();
return d.getTime();
}
var a = currentTime(); //The current time at the point a is defined...
var b = currentTime; //b is a functional reference to currentTime...
var c = b(); //The current time when variable c is defined
var d = c; //The current time when variable c was defined
Beachten Sie, wie wir b()unsere cund dAufgaben genau so anrufen, wie wir anrufen könnten currentTime()?