Чем Function Declaration отличается от Function Expression?

Насколько я понимаю эти два вида функции это просто как бы разные способы объявить функцию, так вот вопрос, зачем созданы именно два способа? Если они оба делают одно и тоже то смысла нет в существовании двух, а иначе, интересно было бы понять в чем разница между этими способами объявления, и что когда лучше использовать.

Ну они по сути одинаковые, но вроде есть одна разница, это что те которые мы создаем обычным способом, не выражением, они создаются интерпретатором до выполнения кода и вызвать их можно до объявления функции, тогда как функция в контексте какого то выражения, то есть expression function такое не сработало бы, вот пример:


same_func();

var
same_func = function () {
alert("I work only after this block")
}

Эта функция вызовет ошибку и не сработает, а вот эта:

same_func2();

function
same_func2() {
alert("I work everywhere!");
}

Сработает везде, когда первая сработает только если вызвать её после блока самой функции.

Такая разница вроде из за того что js ищет перед запуском кода function declaration, и легко их находит так как они начинаются с function, а другой вид функций создается только во время выполнения выражения, то есть процесса присваивания. По сути declaration способ дает больше свободы в плане организации кода.