Uma função criada com uma declaração function é um objeto e tem todas as propriedades, métodos e comportamentos dos objetos .
Uma expressão de função (function expression) é muito similar e tem quase a mesma sintaxe de uma declaração de função. A principal diferença entre uma expressão de função e a declaração de uma função é o nome da função (function name), o qual pode ser omitido em expressões de funções para criar funções anônimas.
HOISTING:
Hoisting (içamento, em português) é um termo que você não encontrará usado em nenhuma prosa de especificação normativa antes da . Hoisting foi pensado como uma maneira geral de pensar sobre como os contextos de execução (especificamente as fases de criação e execução) funcionam em JavaScript. No entanto, o conceito pode ser um pouco confuso a princípio.
Conceitualmente, por exemplo, uma definição estrita de elevação sugere que as declarações de variáveis e funções são fisicamente movidas para o topo do seu código, mas isso não é realmente o que acontece. Em vez disso, as declarações de variável e função são colocadas na memória durante a fase de compilação, mas permanecem exatamente onde você as digitou no seu código
fonte:https://developer.mozilla.org/pt-BR/