Lo que dice Pekka es correcto, pero quiero desarrollar un poco con un ejemplo que ayudará a explicarle a alguien que no comprende completamente los indicadores de función o los delegados.
No lo usaré window.onloadporque es un poco complicado de demostrar. Usaré una función de multiplicación simple para hacer una demostración en su lugar:
function Multiply(operator, operand) {
return operator * operand;
}
Esto también podría escribirse:
Multiply = function(operator, operand) {
return operator * operand;
}
Mientras que en el primer ejemplo, la implicación puede no ser obvia, el segundo ejemplo muestra más claramente que estamos asignando una función que tiene 2 parámetros a una variable llamada Multiply, y este concepto de funciones como asignaciones es común en JavaScript. Ésta es una pequeña demostración del hecho de que las funciones son "ciudadanos de primera clase" , es decir, pueden transmitirse exactamente como si estuviéramos transmitiendo valores.
Entonces ahora a la diferencia de asignación:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
En el momento de definir la variable ret, Multiplyse ejecuta y se asigna el valor de retorno - se retvuelve igual a 12.
Intentémoslo de nuevo de una manera diferente:
var operator = 3;
var operand = 4;
var ret = Multiply;
Ahora, en el punto de definir ret, se retconvierte en tu Multiplyfunción en lugar de ser el resultado obtenido de tu Multiplyfunción. Las llamadas a ret()harán Multiplyque se ejecute su función, y puede llamarla exactamente como si hubiera llamado Multiply(operator, operand):
var out = ret(3, 4);
es lo mismo que
var out = Multiply(3, 4);
Efectivamente ha dicho que lo va a utilizar retcomo delegado Multiply(). Al llamar ret, realmente nos referimos a la Multiplyfunción.
De vuelta a tu window.onload. Piense en esto como:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
Entonces, como puede ver, window.onloades una función como cualquier otra función, no tiene nada de especial. Puede asignarle un valor, asignarle una función, anularlo si lo desea; el punto es que no hay nada más especial window.onloadque su propia función. Lo único ligeramente diferente es que la ventana lo llama cuando se carga. [Descargo de responsabilidad: nunca he anulado las funciones de la ventana, por lo que no estoy seguro de si esto causará repercusiones negativas. Uno esperaría que verifiquen si una función está asignada antes de llamarla, es decir if (window.onload) window.onload();].
Ahora llamar initAll()lo que estamos diciendo es:
window.onload = initAll();
que bien podría decir:
window.onload = 12;
Pero cuando decimos initAllsin los paréntesis, lo que realmente estamos diciendo es: quiero reemplazar lo que sea mi función window.onload, con una nueva función, es decir, quiero reemplazarla con mi initAllfunción, de modo que cualquier llamada a window.onloadejecute mi initAllcódigo.
Entonces:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
se reemplaza con:
window.onload = function() {
return 12;
}
Entonces, cualquier llamada a window.onloadejecutará su initAllfunción en lugar de lo que window.onloadfue originalmente. Ha reemplazado la función original con su nueva función.
De hecho, también podrías escribir:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
Otro ejemplo que puede demostrar mejor es este:
var d = new Date();
var currentTime = d.getTime();
Cualquiera que sea la hora a la que dse define, termina asignada currentTime. Genial, pero eso solo es útil si queremos saber a qué hora se llamó a la función que contiene ese código, es decir, en el momento de carga de la página. ¿Qué pasa si queremos la hora actual en cualquier momento que currentTimese llame?
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
¿Observa cómo llamamos b()a nuestras asignaciones cy dexactamente como podríamos llamar currentTime()?