1日目のゴールと今日やること
この「JavaScript タイマーアプリ(基礎) 初級編」では、
最終的に「スタート」「ストップ」「リセット」ができる、
シンプルなタイマーアプリを作ることを目指します。
でも、1日目のゴールはもっと小さくていいです。
setTimeoutで「時間が経ってから処理を実行する」感覚をつかむ- 「今タイマーが動いているのか?」という“状態”を変数で持つイメージをつかむ
- 「開始」「停止」「リセット」という3つの機能の“考え方”だけ先に理解する
今日はまだ「完成アプリ」にはしません。
タイマーの“心臓”になる部分と、“頭の中の設計図”を作る日 です。
setTimeout ってそもそも何者?
「○秒後にこれやって」を JavaScript に頼む道具
JavaScript は、基本的に「上から順番にすぐ実行」されます。
でも、タイマーアプリを作るときに欲しいのは、
「3秒後に何かしたい」
「1秒後にこの処理を実行したい」
という、「時間が経ってから実行する」仕組みです。
そこで登場するのが setTimeout です。
基本の形はこうです。
setTimeout(実行したい処理, 待つ時間ミリ秒);
JavaScript例えば、「3秒後にアラートを出す」ならこう書きます。
setTimeout(function () {
alert("3秒たちました!");
}, 3000);
JavaScriptここでのポイントは、
- 第1引数:あとで実行したい関数(処理)
- 第2引数:何ミリ秒後に実行するか(1000ミリ秒 = 1秒)
という役割になっていることです。
「あとで実行する関数」という考え方
setTimeout の第1引数に渡す関数は、
「今すぐ実行される」のではなく、
「指定した時間が経ってから実行される」
という点が重要です。
例えば、こう書いたとします。
console.log("スタート");
setTimeout(function () {
console.log("2秒後のメッセージ");
}, 2000);
console.log("エンド");
JavaScript実行すると、表示される順番はこうなります。
スタート
エンド
(2秒後)
2秒後のメッセージ
setTimeout の中身は、「予約」されているだけで、
その場では実行されない、という感覚を持ってください。
まずは「1回だけ鳴るタイマー」を作ってみる
3秒後に「時間です!」と表示する
タイマーアプリの超・超・入り口として、
「3秒後にメッセージを出すだけ」のコードを書いてみます。
console.log("タイマー開始");
setTimeout(function () {
console.log("時間です!");
}, 3000);
JavaScriptこれを実行すると、
タイマー開始
(3秒待つ)
時間です!
という流れになります。
ここで意識してほしいのは、
setTimeoutは「タイマーをセットする」イメージ- 中の関数は「時間が来たときに実行される処理」
という役割分担です。
アロー関数で少しスッキリ書く
同じことを、アロー関数で書くとこうなります。
console.log("タイマー開始");
setTimeout(() => {
console.log("時間です!");
}, 3000);
JavaScript中身はまったく同じです。
「あとで実行する処理」を、短く書けるだけです。
タイマーアプリに必要な「状態管理」という考え方
「今タイマーは動いているのか?」をどう覚えておくか
タイマーアプリには、
最低でもこんな状態が存在します。
- まだ開始していない
- 動いている(カウント中)
- 止まっている(停止中)
- リセットされた(0に戻った)
人間なら「今動いてるかどうか」を感覚で分かりますが、
JavaScript は自分で覚えておかないと分かりません。
そこで必要になるのが、「状態管理」 です。
状態を変数で持つ、という発想
例えば、こんな変数を用意します。
let isRunning = false;
JavaScriptこれは、
false→ 今は動いていないtrue→ 今は動いている
という「フラグ(旗)」のような役割を持ちます。
タイマーを開始するときに true にする。
停止するときに false にする。
というふうに、
「今の状態」を変数で表現する のが状態管理の基本です。
「開始」「停止」「リセット」を頭の中で分解する
開始ボタンがやるべきこと(イメージ)
タイマーの「開始」機能は、ざっくり言うとこうです。
- すでに動いているなら、何もしない
- 動いていないなら、タイマーをセットする
- 「動いている状態」に切り替える
これをコードにすると、イメージとしてはこうなります。
let isRunning = false;
function startTimer() {
if (isRunning) {
// すでに動いているなら何もしない
return;
}
isRunning = true;
setTimeout(() => {
console.log("時間です!");
isRunning = false;
}, 3000);
}
JavaScriptここでのポイントは、
isRunningで「今動いているかどうか」を管理している- 開始時に
trueにして、タイマー終了時にfalseに戻している
という、「状態の変化」をちゃんとコードにしていることです。
停止ボタンがやるべきこと(イメージ)
setTimeout は、「タイマーID」というものを返します。
const id = setTimeout(() => {
console.log("時間です!");
}, 3000);
JavaScriptこの id を使って、clearTimeout(id) と呼ぶと、
「予約していたタイマーをキャンセル」できます。
つまり、「停止」はこういうイメージになります。
let timerId = null;
let isRunning = false;
function startTimer() {
if (isRunning) return;
isRunning = true;
timerId = setTimeout(() => {
console.log("時間です!");
isRunning = false;
timerId = null;
}, 3000);
}
function stopTimer() {
if (!isRunning) return;
clearTimeout(timerId);
isRunning = false;
timerId = null;
}
JavaScriptここで超重要なのは、
setTimeoutの戻り値(タイマーID)を変数に保存しておく- 停止するときに
clearTimeoutにそのIDを渡す
という、「タイマーを止めるための手がかり」を
ちゃんと持っておくことです。
リセットボタンがやるべきこと(イメージ)
リセットは、こういう動きになります。
- タイマーが動いていたら止める
- カウントしている時間を 0 に戻す
- 状態を「停止中」にする
1日目では、まだ「経過時間の表示」まではやりませんが、
頭の中ではこうイメージしておいてください。
let timerId = null;
let isRunning = false;
let elapsed = 0; // 経過時間(ミリ秒)
function resetTimer() {
if (isRunning) {
clearTimeout(timerId);
}
isRunning = false;
timerId = null;
elapsed = 0;
console.log("リセットしました。時間は 0 に戻りました。");
}
JavaScript「止める」と「0に戻す」は別の仕事
という感覚を持っておくと、
後で時間表示を足すときにスムーズです。
1日目のミニ実装:コンソール版「3秒タイマー」
まずはボタンなし、関数だけで動かしてみる
ブラウザのコンソールで試せる、
超シンプルな「開始・停止・リセット」付きタイマーの
“雰囲気だけ”を作ってみましょう。
let timerId = null;
let isRunning = false;
function startTimer() {
if (isRunning) {
console.log("すでにタイマーは動いています。");
return;
}
console.log("タイマー開始(3秒後にメッセージ)");
isRunning = true;
timerId = setTimeout(() => {
console.log("時間です!");
isRunning = false;
timerId = null;
}, 3000);
}
function stopTimer() {
if (!isRunning) {
console.log("タイマーは動いていません。");
return;
}
clearTimeout(timerId);
console.log("タイマーを停止しました。");
isRunning = false;
timerId = null;
}
function resetTimer() {
if (isRunning) {
clearTimeout(timerId);
console.log("動作中のタイマーを停止しました。");
}
isRunning = false;
timerId = null;
console.log("リセットしました。(時間は 0 に戻ったイメージ)");
}
JavaScriptこのコードをブラウザのコンソールに貼り付けて、
startTimer();
JavaScriptと打てば「3秒後に時間です!」が出ます。
途中で
stopTimer();
JavaScriptと打てば止まります。resetTimer() は、今のところ「状態を初期化するだけ」です。
ここで大事なのは、
setTimeoutの戻り値をtimerIdに保存しているisRunningで「今動いているかどうか」を管理している- 「開始」「停止」「リセット」が、それぞれ違う“仕事”をしている
という構造を、なんとなくでも感じることです。
1日目で特に深く理解してほしいこと
1つ目:setTimeout は「あとで実行する処理の予約」
setTimeout(関数, ミリ秒) は、
「ミリ秒後に、この関数を実行してね」
という“予約”です。
その場で実行されるわけではない、
という感覚をしっかり持ってください。
2つ目:タイマーを止めるには「ID」が必要
setTimeout は「タイマーID」を返します。
それを変数に保存しておいて、clearTimeout(そのID) で止めます。
ID を保存していないと、
「どのタイマーを止めればいいか分からない」状態になります。
3つ目:「今タイマーが動いているか?」は状態として持つ
isRunning のような変数で、
- 動いている → true
- 止まっている → false
という状態を持つことで、
- すでに動いているのに「開始」しようとしたときに防げる
- 止まっているのに「停止」しようとしたときにメッセージを出せる
といった、「ちゃんとしたアプリの振る舞い」ができます。
2日目へのつなぎ
1日目は、
setTimeoutの基本的な使い方- タイマーID と
clearTimeoutの関係 isRunningという「状態管理」の考え方- 「開始」「停止」「リセット」の役割のイメージ
ここまでを、頭と手でなじませる日でした。
2日目からは、
この「3秒タイマー」をベースにして、
- 実際に「経過時間」をカウントする
- 1秒ごとに画面を更新する(
setIntervalとの違いも少し触れる) - HTML のボタンと連動させて、「本物のタイマーアプリ」に近づける
という方向に進んでいきます。
最後にひとつ、聞いてみたい。
setTimeout を使った「3秒後のメッセージ」を動かしたとき、
「お、時間を扱えるってちょっと面白いな」と
少しでも感じましたか?
その感覚が、
あなたと「タイマーアプリ」の距離を一気に縮めてくれます。

