Ciò che dice Pekka è corretto, ma voglio elaborare un po 'con un esempio che aiuterà a spiegare a qualcuno che non comprende appieno i puntatori di funzioni oi delegati.
Non lo userò window.onloadperché è un po 'artificioso per dimostrare. Userò invece una semplice funzione di moltiplicazione per la demo:
function Multiply(operator, operand) {
return operator * operand;
}
Questo potrebbe ugualmente essere scritto:
Multiply = function(operator, operand) {
return operator * operand;
}
Mentre nel primo esempio, l'implicazione potrebbe non essere ovvia, il secondo esempio mostra più chiaramente che stiamo assegnando una funzione che ha 2 parametri a una variabile chiamata Multiply, e questo concetto di funzioni come assegnazioni è comune in JavaScript. Questa è una piccola dimostrazione del fatto che le funzioni sono "cittadini di prima classe" , cioè possono essere trasmesse esattamente come se stessimo trasmettendo valori.
Quindi ora la differenza di assegnazione:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
Al punto di definire la variabile ret, Multiplyviene eseguita e viene assegnato il valore di ritorno - retdiventa uguale a 12.
Riproviamo in un modo diverso:
var operator = 3;
var operand = 4;
var ret = Multiply;
Ora, al punto di definire ret, retdiventa la tua Multiplyfunzione anziché essere il risultato ottenuto dalla tua Multiplyfunzione. Le chiamate a ret()causeranno l' Multiplyesecuzione della tua funzione e puoi chiamarla esattamente come se avessi chiamato Multiply(operator, operand):
var out = ret(3, 4);
equivale a
var out = Multiply(3, 4);
Hai effettivamente detto che utilizzerai retcome delegato per Multiply(). Quando si chiama ret, ci riferiamo davvero alla Multiplyfunzione.
Torna al tuo window.onload. Pensa a questo come:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
Quindi, come puoi vedere, window.onloadè una funzione come qualsiasi altra funzione, non c'è niente di speciale in essa. Puoi assegnargli un valore, assegnargli una funzione, annullarlo se lo desideri: il punto è che non c'è niente di più speciale di window.onloadquanto lo sia sulla tua funzione. L'unica cosa leggermente diversa è che viene chiamato dalla finestra quando viene caricato. [Disclaimer: non ho mai effettivamente annullato le funzioni della finestra, quindi non sono sicuro che ciò causerà ripercussioni negative. Si spera che controllino per vedere se una funzione è assegnata prima di chiamarla cioè if (window.onload) window.onload();].
Ora chiamare initAll()quello che stiamo dicendo è:
window.onload = initAll();
che potrebbe anche dire:
window.onload = 12;
Ma quando diciamo initAllsenza parentesi, quello che stiamo veramente dicendo è: voglio sostituire qualunque sia la mia funzione window.onload, con una nuova funzione - cioè voglio sostituirla con la mia initAllfunzione, in modo che qualsiasi chiamata a window.onloadesegua la mia initAllcodice.
Così:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
è sostituito con:
window.onload = function() {
return 12;
}
Quindi qualsiasi chiamata a window.onloadeseguirà la tua initAllfunzione invece di qualunque cosa window.onloadfosse originariamente. Hai sostituito la funzione originale con la tua nuova funzione.
In realtà, si potrebbe ugualmente scrivere:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
Un altro esempio che può dimostrare meglio è questo:
var d = new Date();
var currentTime = d.getTime();
Qualunque sia l'ora in cui dè definita l'ora viene assegnata currentTime. Ottimo, ma è utile solo se vogliamo scoprire a che ora è stata chiamata la funzione contenente quel codice, cioè al momento del caricamento della pagina. E se volessimo l'ora corrente ogni volta che currentTimeviene chiamata?
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
Notate come chiamiamo i b()nostri incarichi ce desattamente come potremmo chiamare currentTime()?