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

function timers(){
     timerId = setTimeout(function() {
          //処理
         timers();
     }, 10);
}

function stoptimers() {
     clearTimeout(timerId);
}

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

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