Pierwsze zdanie zależy od kontekstu, w którym zostało zadeklarowane.
Jeśli zostanie zadeklarowany w kontekście globalnym, utworzy domniemaną zmienną globalną zwaną "foo", która będzie zmienną, która wskazuje na funkcję. Zatem wywołanie funkcji "foo()" może być wykonane w dowolnym miejscu w twoim programie javascript.
Jeśli funkcja jest tworzony w zamknięciu stworzy dorozumianą lokalną zmienną o nazwie „foo”, które można następnie wykorzystać do wywołania funkcji wewnątrz zamknięcia z „foo()”
EDIT:
Powinienem też powiedzieć, że instrukcje funkcyjne (Pierwsza) są analizowane przed wyrażeniami funkcyjnymi (Pozostałe 2). Oznacza to, że jeśli zadeklarujesz funkcję na dole skryptu, nadal będziesz mógł używać jej na górze. Wyrażenia funkcyjne są oceniane tylko wtedy, gdy zostaną trafione przez kod wykonawczy.
END EDIT
Oświadczenia 2 & 3 są prawie równoważne do siebie. Ponownie, jeśli zostaną użyte w kontekście globalnym, utworzą zmienne globalne i jeśli zostaną użyte w zamknięciu, zostaną utworzone zmienne lokalne. Warto jednak zauważyć, że instrukcja 3 zignoruje nazwę funkcji, więc można nazwać funkcję cokolwiek. Dlatego
var foo = function foo() { return 5; }
jest taka sama jak
var foo = function fooYou() { return 5; }
Oto [dobry artykuł na temat nazwanych wyrażeń funkcyjnych] (http://kangax.github.com/nfe). Wyrażenia funkcji kontra deklaracje są adresowane w pierwszej sekcji. –
Główna różnica IMO polega na podnoszeniu. Oto dobry artykuł na ten temat: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html –