JavaScript is an interpreted language: the interpreter runs and executes the program sequentially, therefore, functions have to be defined before they're called
Это тот же самый variable hoisting как для var переменных (чем имя функции и является).
У этого есть свои плюсы, типа упрощения ментальной модели (и компилятора) — ты знаешь всегда что scope твоей функции это просто родительский скоуп и не думаешь от какой до какой строчки у тебя какие функции из скоупа видны.
Но по большому счету это дело привычки. Насколько я понял серьезных преимуществ никакой вариант не дает.