質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1894閲覧

clearIntervalを実行したときの挙動

fbygqw

総合スコア37

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2017/10/10 13:50

setInterval ClearIntervalでループの設定、解除ができるらしいので試していたさいの疑問です
これを実行してみました

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <title>setInterval/clearInterval example</title> <script> var nIntervId; var c = 0; function func1() { nIntervId = setInterval(text, 1000); } function text() { var oElem = document.getElementById('my_box'); oElem.textContent = c; console.log(c); if (c === 5) { clearInterval(nIntervId); } console.log("abcde");//clearintervalしても下まで行く c++; } </script> </head> <body onload="func1();"> <div id="my_box"> <p>Hello World</p> </div> </body> </html>

そうすると、なんとClearIntervalをした後にもconsole.log("abcde");が実行されているんです。
ClearIntervalはsetIntervalでのループをキャンセルするので、てっきり実行されないと思ったのですが、これはそういうものなんでしょうか?ループのキャンセルといいながらその場でループが停止せず最後まで実行してしまうことに納得行きません。
clearIntervalのあとにreturnをつけると無事その場で終了するのですが、やはりループのキャンセルといいながらその場でループが停止せず最後まで実行してしまうことに納得行きません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

clearInterval()その後に発生するべきループ処理をとめるだけで
コールバック自体をとめるわけではありません
従ってclearInterval()を実行した後のconsolelog()やcのインクリメントは
実行されます。
強制的に止めたいなら
clearIntervalの直後にreturn false;などコールバックから抜ける処理を
いれてください

投稿2017/10/10 13:59

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fbygqw

2017/10/10 14:03

なるほど、非常にわかりやすいです。大変あつかましいお願いですが、「コールバックの内容を即座にとめるわけではない」という旨が書いてあるweb上の資料はありますでしょうか?幾ら探しても見当たらなかったので、もしご存知であれば是非知りたいのですが...
yambejp

2017/10/10 14:18

・clearIntervalの仕様 https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/clearInterval 「setInterval を使用して設定された繰り返し動作をキャンセルします」とあります。 ・setIntervalの仕様 https://developer.mozilla.org/ja/docs/Web/API/Window/setInterval 「 clearInterval() を呼び出して、後でインターバルを削除できます」とあります いずれもコールバックを途中で止めるような内容は記載されていませんので 止めなければ関数の最後まで実行されると考えるのが自然です。
guest

0

その場でループが停止せず最後まで実行してしまうことに納得行きません

MDNのドキュメントとかを読むと確かに「繰り返し処理を止める」とあっさり書いてありますね。しかし多くの人(?)は「次回以降の関数の起動を止める」と受け取り「すでに起動済み(かつ実行中)の関数の実行を強制中断する」とは解釈しないと思います。

というのは・・・

もし後者だとすると、例えば2つの関数をsetIntervalで周期的に起動している場合に「両方を止める」ということが書けなくなります。一方、前者の仕様だとclearIntervalを呼び出した後、それ以降の関数の処理が継続しますが、継続したくなければreturnすればいいだけなので、特に不自由は感じません。

こうしたことを想定して「実行中の関数はそのまま普通に継続する」という仕様の方が自然に思え、この点に特に疑問がわくことがない・・・といった感じです。このようなことは、多分ある程度のプログラミング経験を積むとなんとなく身についてくるいわば直観と言えるかと思います。

とはいえ、もっと具体的に明確にドキュメントに書いてほしいと思うこともしばしばです。実際問題として本件のような「驚き」「疑問」「プログラムの思いもよらない振る舞い(バグともいいます)」を経験しながらだんだんとわかっていけばいいのかな・・・と、自分は思います。

アマチュアなのでこんなのんびりした感覚でやってます・・・


追記:
自分のコメントはイマイチでした。経験を積めば不明瞭な点が推測しやすくなるので「そうするしかない」かのように言ってしまってますね。本来は質問者さんの「曖昧なままとせず、明確な定義・仕様を確認する」態度の方こそ大事で、それに沿ったコメントできなかった点を反省してます。失礼しました。

ちなみに、少し当たってみました

Window clearInterval() Method

Definition and Usage

The clearInterval() method clears a timer set with the setInterval() method.
The ID value returned by setInterval() is used as the parameter for the clearInterval() method.

繰り返しを中断という表現よりタイマーをクリアの方がより誤解が少ないように思えました。微妙ですが・・・。いかがでしょうか?

投稿2017/10/10 14:24

編集2017/10/10 15:26
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問