自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

【JavaScript・小ネタ】clearTimeout と clearInterval は同じ結果になるらしい

JavaScript 書いてると、
「○○秒ごとに実行」
みたいなことしたくなること、よくありますよね。

で、そんなときに使うのが setTimeout とか setInterval です。

さらに、その実行の予約をキャンセルするコマンドとして、
それぞれに対応して、clearTimeout と clearInterval というものがあります。

今日は、これに関する小ネタを一つ。

まずは最初に、setTimeout, setInterval のおさらい

setTimeout は一定時間後に一度だけ、指定された処理を、
setInterval は一定時間ごとに、ページを離れたり処理を中断されるまで繰り返すという命令ですね。

setTimeout であれば

setTimeout(実行したい関数, 何ミリ秒後に実行するか);

こんな感じで設定します。
(1ミリ秒は 1 秒の 1000 分の 1)

例えば、

setTimeout(function () {
  console.log(’実行!’);
}, 1000);

こうすれば、1000 ミリ秒、つまり 1 秒後に関数の中身を実行して、
コンソールに 「実行!」と出力するのですね。

setTimeout では 1 度だけ表示されますが、
これを setInterval に置き換えると、1 秒ごとに「実行!」と表示され続けます。

clearTimeout, clearInterval の挙動について

上を読んでいただいて分かるかと思いますが、
setTimeout, setInterval はどちらも「処理を予約する命令」ですね。

その予約を消す方法ももちろんありまして、

var id = setTimeout(function () {
  console.log(’実行!’);
}, 1000);

clearTimeout(id);

こんな感じにすると、どれだけ待っても「実行!」とは表示されません。

setTimeout を設定すると id が払い出されるのですが、
その id を変数に入れておいて、予約が実行される前に clearTimeout の引数に id を渡してあげることで
予約をキャンセルすることができます。

もちろん、setTimeout を解除するための clearTimeout があるということは、
setInterval を解除するための clearInterval もあります。
使い方も、 clearTimeout と同じです。

で、本題。clearTimeout と clearInterval は同じ結果になるらしい

ここまで前置きでしたが、ここから本題。

この clearTimeout と clearInterval 、どちらも同じ処理をしているらしいです。
つまりどういうことか、ですか?

var id = setTimeout(function () {
  console.log(’実行!’);
}, 1000);

clearInterval(id);

こうしても、エラーになるどころか、clearTimeout を使ったときと全く同じように
setTimeout の中の関数はいつまでたっても実行されません。
(エラー云々については、無効な ID を渡してもエラーにはなりませんが)

setInterval に対して clearTimeout を使用した場合も同様に、予約がキャンセルされます。

すなわち、 clearTimeout と clearInterval は入れ替えて使える!ということなんですね。

ちなみに、この類いの話をするときに毎回参考にさせてもらっている MDN の clearTimeout の項
https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/clearTimeout
にはこんな記述があります。

注目に値するのは、 setTimeout() 及び setInterval() で使用される ID のプールは共有されますので、つまり技術的には clearTimeout() 及び clearInterval() は互いに交換できます。しかし、明確化のため、そのようなことは避けてください。

なるほど、内部的には setTimeout と setInterval の ID リストは同じものを使用しているので、
どちらもそのリストから ID を削除するという意味で、挙動が同じになるという感じですね。

ということで、これは仕様みたいですね。

でも、リファレンスにもあるように、交換して使う意味は皆無ですし、混乱を招きますから、
実際には使わないようにしてくださいね。

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

Takato Ezaki
takato_ezaki
記事一覧