setTimeout()に渡したコールバック関数は、JavaScriptランタイムのメッセージキューに登録されます。 setTimeout()の呼び出し元は、コールスタックのすべての関数がreturnすることで、ランタイムに処理が戻ります。 ランタイムは、メッセージキューにすぐに実行できる関数があれば実行し、なければ待ちます。 メッセージキューには setTimeout()で登録されたもののように、一定時間後にならなければ実行できないものと、setImmediate()やPromiseで登録されたもののように即座に実行できるものがあります。 メッセージキューが空になると、Node.jsの環境であればプログラムが終了します。 setTimeout()のスリープで何が問題か? setTimeout()は、上述の通り現在のコールスタックがすべてreturnしなければ処理が始まらないのですから、現