js timer処理の再帰呼び出しループの疑問


タイマーをjsで作る際に下記のように再帰呼び出しで作ることがよくあると思います。  
この処理がうまくいくことが疑問です。

[code]

    function timers(){
         timerId = setTimeout(function() {
              //処理
             timers();
         }, 10);
    }
    
    function stoptimers() {
         clearTimeout(timerId);
    }
    
[/code]

変数timerIdに入ったタイマーIDを引数にclearTimeoutをしているのでタイマーが止まる仕組みなのはわかるのですが、再帰呼び出しで無限ループしていると＝の右の処理が終了していないので代入は行われないのではないでしょうか？どのタイミングで変数timerIdに値が入っているのか不明です。

ご存知の方教えてください。




代入の時点では再帰呼び出し（？）は起こっていなくて、単に関数式として保持されるだけ（指定時間経過後に呼び出されて実行される）なので、呼び出す処理が終わっていなくても代入を完了できます。

* * *

関数式は引数として渡された時に実行されてその結果に置き換えられるのではなくて単に関数オブジェクトなので、これを再帰呼び出しというかは疑問に思います。  
おそらくは、キューのようなものに  
[`function() {timers(); }`,`function() {別の関数とか(); }`,`function() {timers();
}/*※同時には積まれない。次の(つまり未来の)やつのつもり*/`,...]//キューのつもり  
のように並びで格納されて先から呼び出されて消費される。  
というようなイメージで実行されるかと思います。

