Per spiegare meglio quel che accade:
la funzione viene incapsulata dentro una funzione anonima, il che ne preserva la visibilità della variabile.
Nel codice che tu hai postato ci sono 3 elementi discutibili:
1) chiami la funzione prima che la sua signature sia caricata in memoria - se ti funziona è perchè sei fortunato e il runtime non fa a tempo ad accorgersi di questa differenza, ma le funzioni si chiamano DOPO che sono state definite, non prima
2) fai un clear del timeout ma esso non è necessario (setTimeout si esegue una volta sola, per cui non corri il rischio che si ripeta, se era questo che temevi): lo sarebbe per un setInterval
3) metti il timeout dentro la funzione, ed esso richiama la funzione: sarebbe meglio invocare il timeout fuori della funzione, eprchè se prendi questa abitudine rischi prima o poi di ritrovarti davanti a brutte ricorsioni (in tal caso il clearTimeout ti metteva una pezza sopra un errore concettuale potenzialmente grave, e te lo faceva passare inosservato).