Как Angular выявляет зависимости по сигнатуре функции вида function($service1, $service2,...)?
Ядро производит парсинг исходного кода функции и выделяет из него имена аргументов?
Рекурсивная перегрузка (или поиск "листа на дереве") - вполне возможно.
Возможно, изначально ещё проверяет, что все входные переменные не содержат undefined.
Точный вариант: посмотреть исходники и понять логику)