Noté una diferencia al llamar a una función con paréntesis vacíos o sin ningún paréntesis. Sin embargo, no paso ningún argumento a la función, así que me pregunté cuál sería la diferencia entre:
window.onload = initAll();
y
window.onload = initAll;
Explique el principio detrás de esto.
javascript
Decano
fuente
fuente
(
PARENTESIS IZQUIERDA = paréntesis de apertura (1.0) y 0029)
PARENTESIS DERECHA = paréntesis de cierre (1.0) - unicode.org/charts/charindex.html#P y lo que Dictionary.com tiene que decir al respecto - dictionary.reference.com/ navegar / PARENTHESIS "Una o ambas líneas curvas verticales, () ..."{}
se llaman paréntesis de ardilla.Respuestas:
Esto se ejecuta de
initAll()
inmediato y asigna el valor de retorno de la función awindow.onload
. Por lo general, esto no es lo que desea.initAll()
tendría que devolver una función para que esto tenga sentido.esto asigna la función real a
window.onload
- esto es posible porque en JavaScript, como dice @Felix, las funciones son objetos de primera clase - sin ejecutarlo.initAll
será ejecutado por el evento de carga.fuente
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.onload
porque es un poco complicado de demostrar. Usaré una función de multiplicación simple para hacer una demostración en su lugar:Esto también podría escribirse:
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:
En el momento de definir la variable ret,
Multiply
se ejecuta y se asigna el valor de retorno - seret
vuelve igual a 12.Intentémoslo de nuevo de una manera diferente:
Ahora, en el punto de definir
ret
, seret
convierte en tuMultiply
función en lugar de ser el resultado obtenido de tuMultiply
función. Las llamadas aret()
haránMultiply
que se ejecute su función, y puede llamarla exactamente como si hubiera llamadoMultiply(operator, operand)
:es lo mismo que
Efectivamente ha dicho que lo va a utilizar
ret
como delegadoMultiply()
. Al llamarret
, realmente nos referimos a laMultiply
función.De vuelta a tu
window.onload
. Piense en esto como:Entonces, como puede ver,
window.onload
es 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 especialwindow.onload
que 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 decirif (window.onload) window.onload();
].Ahora llamar
initAll()
lo que estamos diciendo es:que bien podría decir:
Pero cuando decimos
initAll
sin 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 miinitAll
función, de modo que cualquier llamada awindow.onload
ejecute miinitAll
código.Entonces:
se reemplaza con:
Entonces, cualquier llamada a
window.onload
ejecutará suinitAll
función en lugar de lo quewindow.onload
fue originalmente. Ha reemplazado la función original con su nueva función.De hecho, también podrías escribir:
Otro ejemplo que puede demostrar mejor es este:
Cualquiera que sea la hora a la que
d
se define, termina asignadacurrentTime
. 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 quecurrentTime
se llame?¿Observa cómo llamamos
b()
a nuestras asignacionesc
yd
exactamente como podríamos llamarcurrentTime()
?fuente
Las funciones en javascript son ciudadanos de primera clase y, como tales, pueden asignarse a otras variables o pasarse como argumentos.
Entonces, cuando lo hagas
Está configurando la
onload
propiedad delwindow
objeto para hacer referencia a lainitAll
función en sí.Cuando tu lo hagas
Está configurando la
onload
propiedad para que mantenga el valor de retorno de initAll, ya que se ejecutará en su lugar en esa línea.fuente
initAll
es una referencia a un valor de función y el operador de corchetes adjunto al nombre de la función EJECUTA este objeto de función.Entonces, si haces algo como
luego
a
será lo mismo queinitAll
, por ejemplo, puede hacerloa()
, pero conla variable
a
obtendrá el valor de retorno de lainitAll
función ejecutadafuente
Llego 6 años tarde, pero creo que esto podría haberse explicado de manera mucho más simple que las respuestas anteriores.
Entonces aquí está el TLDR ; o vista de pájaro al llamar a funciones usando y no usando
()
'sTomemos esta función por ejemplo:
si registra "foo" - sin
()
No usar
()
medios para buscar la función en sí . Haría esto si desea que se transmita como una devolución de llamada.si registra "foo ()" - con
()
Usar
()
después de una función significa ejecutar la función y devolver su valor .fuente