La ejecución asincrónica de una función de devolución de llamada no es una característica del lenguaje. Depende únicamente de la implementación de la función en cuestión.
Las funciones en JavaScript son valores. Eso significa que pueden ser manipulados y pasados dentro y fuera de funciones sin necesariamente ser llamados. Cuando vincula un nombre a una expresión de función, por ejemplo, var myFunc = function () {}
, el nombre se refiere a un objeto Function invocable. Para llamar al invocable, debe proporcionar la lista de argumentos, incluso cuando está vacía. Por lo tanto, una expresión de función que no es seguida por paréntesis es válida pero no se ejecuta. La llamada equivalente para una expresión de función que no está vinculada a un nombre es casi idéntica.
(function () {})()
o
(function () {} ())
- ¿Son defectuosos los números complejos?
- ¿Cómo puedo calcular los fallos de página a partir de la cadena de referencia y los marcos disponibles?
- ¿Cuáles son algunas de las aplicaciones comunes de Machine Learning?
- ¿Necesito ser bueno en matemáticas para hacer una programación competitiva?
- ¿Es el operador de módulo (%) adecuado para el muestreo?
El conjunto adicional de paréntesis no está estrictamente definido en la especificación. La mayoría de las veces es el azúcar sintáctico para que el motor JS sepa que la palabra clave de function
se usa en el contexto de una expresión en lugar de una definición de función.
El caso al pasar funciones de devolución de llamada es, por lo tanto, que las pasamos como expresiones de funciones no ejecutadas. A partir de ese momento, corresponde a la persona que llama decidir qué hacer con la devolución de llamada.
Pueden decidir llamarlo sincrónicamente simplemente llamando al argumento recibido (por ejemplo, callback()
, donde callback
es el nombre vinculado internamente al valor de devolución de llamada).
En su lugar, podrían llamarlo en una iteración futura del bucle de eventos (por ejemplo, utilizando escuchas de eventos en el navegador o process.nextTick()
en el nodo). El nodo mismo lo hace internamente en su implementación de C ++ por razones de rendimiento.
Incluso podrían ignorarlo por completo y no llamarlo en absoluto. Todo depende de la persona que llama.
Dicho esto, en la mayoría de los casos, una devolución de llamada ejecutada sincrónicamente es probablemente un signo revelador de un diseño deficiente.