A pedido, aquí hay comentarios presentados como respuesta:
No estoy seguro de que comprenda por completo el hecho de que las funciones en JS son objetos de primera clase y, por lo tanto, pueden almacenarse hasta que se necesiten, más allá del tiempo en que se crean.
Por ejemplo, digamos que desea escribir en un archivo, luego imprima un mensaje de registro; entonces llama a la función "write ()" (o lo que sea) y le pasa una función que emite el mensaje de registro (esta es la función de devolución de llamada diferida). "write ()" almacena internamente una referencia a la función dada, comienza a escribir en el archivo y configura su propia devolución de llamada para saber cuándo finaliza la escritura. Luego regresa antes de terminar la escritura; cuando es así, la devolución de llamada interna se llama de alguna manera (este es el trabajo del marco subyacente, en el caso de node.js, se realiza con un bucle de eventos), que luego llama a su devolución de llamada que imprime el mensaje de registro.
La parte "diferida" simplemente significa que su función de devolución de llamada no se llama de inmediato; llamarlo se difiere hasta el momento apropiado. En el caso de funciones asincrónicas como muchas de las de node.js, la devolución de llamada dada generalmente se llama cuando se completa la operación (o se produce un error).
La mayoría de las cosas son asíncronas en node.js, pero en el navegador con, por ejemplo, jQuery, la mayoría de las cosas son realmente sincrónicas (excepto, obviamente, para solicitudes AJAX). Dado que las funciones de primera clase son muy útiles en JavaScript (especialmente debido al excelente soporte de cierre), las devoluciones de llamada también se usan en todas partes en el navegador, pero no se "difieren" para operaciones síncronas (excepto en la medida en que no son llamadas inmediatamente por usted, pero luego por la función que llama).
El hecho de que el sistema subyacente esté controlado por eventos es ortogonal al uso de devoluciones de llamada diferidas; puede imaginar una versión (muy lenta) de node.js que inició un hilo para cada operación, y luego llamó a su devolución de llamada dada cuando el hilo terminó su trabajo, sin usar eventos en absoluto. Por supuesto, este es un modelo horrible, pero ilustra mi punto :-)
Deferred
objetos de jQuery ? ¿Se trata de algo específico de Node.js?