Ils sont en fait très similaires. Comment vous les appelez, est exactement le même, mais la différence réside dans la façon dont le navigateur charge dans le contexte d'exécution.
les déclarations de fonction des charges avant le code est exécuté.
Alors que les expressions de fonction charge uniquement lorsque l'interprète atteint cette ligne de code.
Donc, si vous essayez d'appeler une fonction d'expression avant qu'il soit chargé, vous recevrez un message d'erreur
Mais si vous appelez une déclaration de fonction, ça va toujours. Parce que le code ne peut être appelé jusqu'à ce que toutes les déclarations sont chargés.
ex. Expression De Fonction
alert(foo()); // ERROR! foo wasn't loaded yet
var foo = function() { return 5; }
ex. Déclaration De La Fonction
alert(foo()); // Alerts 5. Declarations are loaded before any code can run.
function foo() { return 5; }
Comme pour la deuxième partie de vos questions.
var foo = function foo() { return 5; }
est vraiment la même chose que les deux autres. C'est juste que cette ligne de code utilisé pour provoquer une erreur dans safari. Je ne sais pas si elle le fait encore. N'ai pas essayé.