A primeira forma é mais direta, você não declara o nome da função. É mais fácil, porém você não vai conseguir dar unbind depois, pois não terá o nome da função para desbindar. Ideal para quando você quer dar binds permanentes, que não serão desbindadas depois. Essa forma também não permite que você chame por outras formas, por exemplo via comando.
A segunda forma resolve todas as limitações da primeira, porém você precisa declarar um nome para a função. Normalmente essa é a forma mais usada.
A terceira forma com função local é usada somente por usuários avançados em situações específicas. Funções locais não funcionam fora de seu escopo, porém são um pouco mais leves do que as funções globais, pois elas são apagadas da memória depois que o programa sai do escopo em que elas foram criadas. Também são mais difíceis de hackear com scripts de terceiros que reescrevem sua função.
Eu particularmente uso mais a primeira e segunda forma.