Ce que Pekka dit est correct, mais je veux développer un peu avec un exemple qui aidera à expliquer à quelqu'un qui ne comprend pas complètement les pointeurs de fonction ou les délégués.
Je n'utiliserai pas window.onloadparce que c'est un peu artificiel pour le démontrer. Je vais utiliser une simple fonction de multiplication pour faire une démonstration à la place:
function Multiply(operator, operand) {
return operator * operand;
}
Cela pourrait également s'écrire:
Multiply = function(operator, operand) {
return operator * operand;
}
Alors que dans le premier exemple, l'implication n'est peut-être pas évidente, le deuxième exemple montre plus clairement que nous assignons une fonction qui a 2 paramètres à une variable appelée Multiply, et ce concept de fonctions comme affectations est courant dans tout JavaScript. Ceci est une petite démonstration du fait que les fonctions sont des «citoyens de première classe» , c'est-à-dire qu'elles peuvent être transmises exactement comme si nous transmettions des valeurs.
Alors maintenant à la différence d'affectation:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
Au moment de définir la variable ret, Multiplyest exécuté et la valeur de retour est affectée -ret devient égale à 12.
Essayons à nouveau d'une manière différente:
var operator = 3;
var operand = 4;
var ret = Multiply;
Maintenant, au moment de la définition ret, retdevient votre Multiplyfonction au lieu d'être le résultat obtenu à partir de votre Multiplyfonction. Les appels à ret()entraîneront Multiplyl'exécution de votre fonction et vous pourrez l'appeler exactement comme si vous aviez appelé Multiply(operator, operand):
var out = ret(3, 4);
est le même que
var out = Multiply(3, 4);
Vous avez effectivement dit que vous allez utiliser retcomme délégué pour Multiply(). Lorsque vous appelez ret, nous nous référons vraiment auMultiply fonction.
Revenez à votre window.onload. Considérez cela comme:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
Donc, comme vous pouvez le voir, window.onloadest une fonction comme toute autre fonction, il n'y a rien de spécial à ce sujet. Vous pouvez lui attribuer une valeur, lui attribuer une fonction, l'annuler si vous le souhaitez - le fait est qu'il n'y a rien de plus spécial à propos window.onloadde votre propre fonction. La seule chose légèrement différente est qu'elle est appelée par la fenêtre lorsqu'elle est chargée. [Clause de non-responsabilité: je n'ai jamais annulé les fonctions de fenêtre, donc je ne suis pas sûr que cela entraînera des répercussions négatives. On espère qu'ils vérifient si une fonction est affectée avant de l'appeler ieif (window.onload) window.onload(); ].
Maintenant, nous appelons initAll()ce que nous disons:
window.onload = initAll();
ce qui pourrait aussi bien dire:
window.onload = 12;
Mais quand nous disons initAllsans les parenthèses, ce que nous disons vraiment est: je veux remplacer quelle que soit ma fonction window.onload, par une nouvelle fonction - c'est-à-dire que je veux la remplacer par ma initAllfonction, de sorte que tout appel à window.onloadexécute moninitAll code.
Alors:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
est remplacé par:
window.onload = function() {
return 12;
}
Donc, tout appel à window.onloadexécutera votre initAllfonction au lieu de quoi que ce soitwindow.onload était à l'origine. Vous avez remplacé la fonction d'origine par votre nouvelle fonction.
En fait, vous pouvez également écrire:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
Un autre exemple qui peut mieux démontrer est celui-ci:
var d = new Date();
var currentTime = d.getTime();
Quelle que soit l'heure à laquelle le moment dest défini, elle est attribuée currentTime. Génial, mais ce n'est utile que si nous voulons savoir à quelle heure la fonction contenant ce code a été appelée - c'est-à-dire au moment du chargement de la page. Et si nous voulons l'heure actuelle à tout moment qui currentTimeest appelé?
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
Remarquez comment nous appelons b()nos cet daffectations exactement comme nous pourrions appeler currentTime()?