@caer: no w porządku, ale hosting jest robiony przez parser zatem w kodzie można sobie deklarację wrzucać w dowolnym miejscu.
Można, ale nie powinno się tego robić. Wyjątkiem jest przenoszenie szczegółów implementacyjnych na dół pliku. Innymi słowy wszystkie deklaracje funkcji są na dole, a logika na górze, ale tylko w tym wypadku.
- Możesz korzystać z zmiennych, które jeszcze nie zostały zdefiniowane (...) Pomieszałem pojęcia: zamiast "definiowane" powinno być "deklarowane", reszta się zgadza.
Deklaracja zmiennej, to: var x. Definicja zmiennej, to x = wartość. Jeżeli używasz use strict, to nie możesz użyć niezdeklarowanej zmiennej, bo dostaniesz ReferenceError (poza strict modem zostanie utworzona zmienna globalna!), a jeżeli spóbujesz wywołać niezadeklarowaną funkcję, to nawet bez use strict go dostaniesz.
Z Twojej perspektywy wydaje Ci się, że możesz wywołać jeszcze niezadeklarowaną funkcję, bo w twoim pliku script.js występuje ona po wywołaniu, ale to nie prawda, bo parser ją i tak przesuwa na górę zasięgu (hoisting). Oczywiście rozumiem skrót myślowy, ale trzeba uwazac, bo nowi nie wiedza o co chodzi :) Dlatego powinniśmy wszystkie zmienne (z uzyciem var) deklarować na początku funkcji (czy też zasięgu).
- Kontekst zmiennych jest dla funkcji a nie bloku kodu,
Półprawda. Najnowszy, już powszechnie używany standard, wprowadził słowa kluczowe, które pozwalają nam zadeklarować zmienną o zasięgu blokowym. Są to let i const i to z nich powinniśmy korzystać.
Nie czepiam się, chciałem tylko doprecyzować. Zapraszam tu Jak uczyć się JavaScript? - przeczytaj, zanim zadasz pytanie na temat materiałów do nauki., a w szczególności do przeczytania You Don't Know JS.