Асинхронность
Все функции обратного вызова в асинхронных функциях (в данном случаи setTimeout())
помещаются в специальную очередь выполнения, и начинают выполняться после того, как все остальные синхронные вызовы в приложении завершат свою работу
Обратите внимание, в очередь на выполнение передается не та функция обратного вызова, которая передается в функцию sum(), а функция, которая передается в setTimeout()
При вызове функции sum() в нее передается функция обратного вызова, которая в случае отсутствия ошибок просто выводит данные на консоль
В итоге, выполнение на функции sum() не блокируется, а продолжается дальше. И это особенно актуально, если в приложении идет какая-либо функция ввода-вывода, например, чтения файла или взаимодействия с базой данных, выполнение которой может занять продолжительное время. То общее выполнение приложение не блокируется, а продолжается дальше
Макс