Hallo,
function-statements werden vom JavaScript parser sozusagen vor eingelesen und können deshalb auch schon aufgerufen werden, bevor sie im Quellcode definiert sind.
Ja, »sozusagen«. Als einfache Veranschaulichung ist das in Ordnung.
Als Parser wird bei der Verarbeitung von Programmiersprachen üblicherweise das Modul bezeichnet, das den Quellcode in einen abstrakten Syntaxbaum überführt. Der Parser liest das Programm immer von vorne bis hinten ein. Mit der Ausführung des Programms hat der Parser nichts zu tun, diese operiert auf dem abstrakten Syntaxbaum.
Um zu erklären, was hier intern vorgeht, ist der Begriff des Ausführungskontextes hilfreich.
ECMAScript definiert: »Every invocation of an ECMAScript code function … establishes and enters a new execution context«. Beim Ausführen von Funktionen gelten die Schritte Entering Function Code, darin passiert die Declaration Binding Instantiation. Punkt 5 dort regelt die frühe Verarbeitung von Funktionsdeklarationen: »For each FunctionDeclaration f in code, in source text order do … «: erzeuge ein Binding im aktuellen Scope. Erst danach wird der Funktionskörper samt Expressions ausgeführt.
Das ist das sogenannte Hoisting (Hochziehen) von Funktions- und Variablendeklarationen, was zu dem oben genannten Verhalten führt.
Diese Kenntnisse sind nicht zwingend notwendig, aber letztlich sehr hilfreich beim Verständnis verschiedener zentraler JavaScript-Phänomene, darunter Scopes, Identifier Resolution, lokale Variablen, Closures, this und der Strict-Modus.
Dmitry Soshnikov hat einmal versucht, dieses Wissen kompakt in einem Artikel zusammenzutragen, den ich ins Deutsche übersetzt habe.
Siehe auch:
http://davidshariff.com/blog/what-is-the-execution-context-in-javascript/
Mathias