El navegador lee su HTML de principio a fin y puede ejecutarlo tal como se lee y analiza en fragmentos ejecutables (declaraciones de variables, definiciones de funciones, etc.) Pero en cualquier momento solo puede usar lo que se ha definido en el script antes de ese punto.
Esto es diferente de otros contextos de programación que procesan (compilan) todo su código fuente, quizás lo vinculen con cualquier biblioteca que necesite para resolver referencias y construyan un módulo ejecutable, en cuyo punto comienza la ejecución.
Su código puede hacer referencia a objetos con nombre (variables, otras funciones, etc.) que se definen más adelante, pero no puede ejecutar el código de referencia hasta que todas las piezas estén disponibles.
A medida que se familiarice con JavaScript, se dará cuenta de su necesidad de escribir las cosas en la secuencia adecuada.
Revisión: para confirmar la respuesta aceptada (arriba), use Firebug para recorrer la sección de secuencia de comandos de una página web. Verá que salta de una función a otra, visitando solo la primera línea, antes de que realmente ejecute cualquier código.