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

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

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

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

Q&A

解決済

2回答

1167閲覧

javascriptでの関数内の処理の順序について

amineo

総合スコア15

JavaScript

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

1グッド

0クリップ

投稿2019/04/05 10:41

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

関数の中での実行順序について。

var n = 0; function countSecond() { n++; document.getElementById("sample1").innerHTML = n+"回目の2秒が経過しました。"; countUp(); function countUp() { if (n > 3) { clearTimeout(); document.getElementById("sample1").innerHTML = "お知らせを終了します。"; } else { setTimeout('countSecond()',2000); }

countSecondの中の処理なのですが、
n++ → sample1の文面変更 → countUPの実行という順だと思うのですが、

処理が終了されるのはn=4となってcountUpが
実行される時だと思うので、
4回目の〜〜という表示までされるべきだと思うのですが、
N=3まででの処理で終わってしまいました。

私の考えている処理の順番が違うということなのでしょうか?

エラーメッセージ

該当のソースコード

javascript ソースコード <script> var n = 0; function countSecond() { n++; document.getElementById("sample1").innerHTML = n+"回目の2秒が経過しました。"; countUp(); function countUp() { if (n === 3) { clearTimeout(); document.getElementById("sample1").innerHTML = "お知らせを終了します。"; } else { setTimeout('countSecond()',2000); } } } </script> <div id="sample1"> <button onclick="setTimeout('countSecond()',2000)">2秒ごとに3回お知らせします</button> </div>

試したこと

ここに問題に対して試したことを記載してください。
if===3などとしてみて結果がどうなるか考察してみたりした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

n=3の時に、countUp();が呼ばれると、

js

1 if (n > 3) { // 3 > 3 なので真 2 clearTimeout(); 3 document.getElementById("sample1").innerHTML = "お知らせを終了します。"; 4 } else {

条件が成立し、お知らせを終了します。となりそうな?

間違えましたので、追記

js

1document.getElementById("sample1").innerHTML = n+"回目の2秒が経過しました。";

から、

js

1 if (n > 3) { 2 clearTimeout(); 3 document.getElementById("sample1").innerHTML = "お知らせを終了します。"; 4 } else {

までがノータイムなので、n=4の表示が瞬間的に書き換えられているのだと思います。

投稿2019/04/05 10:55

編集2019/04/05 11:07
Lhankor_Mhy

総合スコア36138

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

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

amineo

2019/04/05 10:57

たしかにそうですねw ありがとうございます!
Lhankor_Mhy

2019/04/05 11:01

ん? あれ? 違うのか。 テストコードの方と勘違いしてました。もう少し考えて見ます。
Lhankor_Mhy

2019/04/05 11:02

あれ? 解決した? 解決してないですよね?
amineo

2019/04/05 11:17

あ、してなかったです。 すいません、下の方のn===3が間違ってました。 ノータイムということですが、 n=4になってからのinnerHTMLの処理と、clearTimeoutの処理が同時に行われるってことですか?
Lhankor_Mhy

2019/04/05 11:25

あ、いえ、そうではなくて、このコードの clearTimeout() って、全く意味がないんですよ。 試しに削除して実行してみてください、普通に動きますよ。 なので、 「4回目の2秒が経過しました。」 ↓  ここが瞬間で切り替わる。 「お知らせを終了します。」 ということでして、 「4回目の2秒が経過しました。」は表示されているものの目にもとまらぬ速さで消えているのです。
Lhankor_Mhy

2019/04/05 11:27

というか、厳密に言うと、おそらくDOMのリフレッシュ前にinnerHTMLが書き換えられているので、表示される前に消えている、という表現が正しそうです。
amineo

2019/04/05 16:06

コンソールでやってみてわかりました! ありがとうございます!
guest

0

解決済みのところ、蛇足なコメントで恐縮ですが、Lhankor_Mhyさんの回答に補足します。
ブラウザのコンソールなどで結構なので、下記のコードを実行してみてください。
「4回目の2秒が経過しました。」のあと、「お知らせを終了します。」が瞬時に実行されていることがわかると思います。

js

1 2(() => { 3 var n = 0; 4 var started = new Date(); 5 function countSecond() { 6 n++; 7 console.log(`処理開始から${Math.floor(((new Date()).getTime() - started.getTime()) / 1000)}秒後`, `${n}回目の2秒が経過しました。`); 8 countUp(); 9 } 10 11 function countUp() { 12 if(n > 3) { 13 console.log(`処理開始から${Math.floor(((new Date()).getTime() - started.getTime()) / 1000)}秒後`, 'お知らせを終了します。'); 14 } else { 15 setTimeout(countSecond, 2000); 16 } 17 } 18 19 setTimeout(countSecond, 2000); 20})();

「4回目の2秒が経過しました。」が表示されることを人間の目で確認するには、「お知らせを終了します。」の表示を遅らせる

js

1if(n > 3) { 2 setTimeout(()=>{ 3 document.getElementById('sample1').innerHTML = 'お知らせを終了します。'; 4 }, 2000) 5}

あるいは、別のDOMに表示させる

js

1if(n > 3) { 2 let sample1 = document.getElementById('sample1'); 3 let notice = document.createElement('div'); 4 notice.innerHTML = 'お知らせを終了します。'; 5 sample1.parentNode.insertBefore(notice, sample1.nextSibling); 6}

のがよいかと思います。 (個人的な意見ですが)

投稿2019/04/05 12:08

thyda.eiqau

総合スコア2982

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

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

amineo

2019/04/05 16:07

コンソールでやってみたらわかりました! ご丁寧にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問