Du berücksichtigst nicht den Kontext, in dem der Aufruf erfolgt.
Oder ich verstehe was falsch ...
Du hast übersehen, dass er die Funktion als Code aufruft, d.h. in Anführungszeichen:
setTimeout("scroll_down()", 10000);
Du dürftest also richtig gelegen haben: Der Code in den Anführungszeichen wird erst bei Bedarf interpretiert, nicht sofort, und damit ist der Kontext weg.
Übergibt er hingegen keinen Code, sondern die Funktion selbst, also
setTimeout(scroll_down, 10000);
erkennt der Interpreter sie schon beim setTimeout()-Aufruf und kann sie sozusagen zurücklegen.