質問: setTimeout(function() { //処理 timers(); }, 10); } function stoptimers() { clearTimeout(timerId); } ``` 変数timerIdに入ったタイマーIDを引数にclearTimeoutをしているのでタイマーが止まる仕組みなのはわかるのですが、再帰呼び出しで無限ループしていると=の右の処理が終了していないので代入は行われないのではないでしょうか?どのタイミングで変数timerIdに値が入っているのか不明です。 ご存知の方教えてください。
回答: 一番分かりやすいのは、ブラウザで実際にsetTimeout関数を実行してみることです。Google Chromeのコンソールなどで以下のコードを実行してみてください。 ``` setTimeout(function() { console.debug('done'); }, 1000) ``` 実行直後に表示される数値がsetTimeout関数の戻り値であるtimeoutIDです。その1秒後に、コンソール上に「done」と表示されるはずです。 javascriptの関数は第1級オブジェクトと呼ばれ、変数に代入したり、関数の引数や戻り値にしたりできます。setTimeout関数の第1引数は関数です。例のソースでは、その場で無名関数を定義をし引数として渡しているので、慣れないうちはややこしく感じるかもしれません。 以下のソースを見れば理解しやすいかと思います。(処理としては等価です) ``` function timers() { timerId = setTimeout(next, 10); // ↑ next関数を呼び出しているのではなく、関数定義を渡している // next関数を呼び出したい場合はnext()のように括弧が必要 } function next() { console.debug('next'); timers(); } .... ```