По желанию, вот комментарии, представленные в качестве ответа:
Я не уверен, что вы полностью осознаете тот факт, что функции в JS являются первоклассными объектами и поэтому могут храниться до тех пор, пока они не понадобятся, по истечении времени их создания.
Например, скажем, вы хотите записать в файл, а затем распечатать сообщение журнала; поэтому вы вызываете функцию «write ()» (или как угодно) и передаете ей функцию, которая выводит сообщение журнала (это функция отложенного обратного вызова). «write ()» внутренне хранит ссылку на данную функцию, начинает запись в файл и устанавливает свой собственный обратный вызов, чтобы знать, когда запись завершена. Затем он возвращается до завершения записи; когда это так, внутренний обратный вызов как-то вызывается (это работа базового фреймворка - в случае с node.js это делается с помощью цикла обработки событий), который затем вызывает ваш обратный вызов, который печатает сообщение журнала.
«Отложенная» часть просто означает, что ваша функция обратного вызова не вызывается сразу; Вызов его откладывается до соответствующего времени. В случае асинхронных функций, таких как многие из таковых в node.js, данный обратный вызов обычно вызывается, когда операция завершается (или возникает ошибка).
Большая часть содержимого является async в node.js, но в браузере с, например, jQuery, большая часть содержимого фактически синхронна (за исключением, очевидно, для запросов AJAX). Так как первоклассные функции очень удобны в JavaScript (особенно из-за большой поддержки замыканий), обратные вызовы также используются повсюду в браузере, но они не «откладываются» для синхронных операций (кроме тех случаев, когда они не вызываются немедленно вы, но позже с помощью функции, которую вы вызываете).
Тот факт, что базовая система управляется событиями, является ортогональным к использованию отложенных обратных вызовов; Вы можете представить себе (очень медленную) версию node.js, которая запускает поток для каждой операции, а затем вызывает заданный обратный вызов, когда поток завершает свою работу, вообще не используя события. Конечно, это ужасная модель, но она иллюстрирует мою точку зрения :-)
Deferred
объекты jQuery ? Это что-то конкретное для Node.js?