One of the main differences is that function declarations will be hoisted, meaning they are loaded before any code is executed. Imagine that you make a function call in line 2 of your code, but the function declaration is below it. It would still work. Function declarations become available to all your code.
Function expressions on the other hand, are saved as variables or directly defined as arguments to other functions. They aren’t hoisted but that can be a good thing. Function expressions avoid polluting the global scope, and that’s a big deal. Often you’ll find that you need a function to do a very specific job, and the rest of your code doesn’t need it at all. These are prime cases when you’ll want to use function expressions.
some extra reading on the topic