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

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

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

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

Q&A

解決済

4回答

545閲覧

関数についてお聞きしたいです

cheetoi

総合スコア10

JavaScript

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

0グッド

0クリップ

投稿2020/12/22 06:35

jacaScript

1function blockTime(timeout) { 2 const startTime = Date.now(); 3 4 while (true) { 5 const diffTime = Date.now() - startTime; 6 if (diffTime >= timeout) { 7 return; 8 } 9 } 10} 11console.log("処理を開始"); 12blockTime(1000); 13console.log("この行が呼ばれるまで処理が1秒間ブロックされる");

こちらは11行目が呼ばれてから1秒後に13行目が呼ばれる関数のようですが、この仕組みが理解できないです。
まず5行目のDate.now() - startTimeの値が0にならないことについてです。
2行目にconst startTime = Date.now()と記されているのでdiffTimeの値は0たと思うのですが、試しにコンソールにdiffTimeを出力したら無限ループが起きてしまい、0ではありませんでした。なぜこのような挙動になるかご教授願いたいです。

また7行目のreturnが何を意味しているか分からないので教えていただけますでしょうか?
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

このようなコードは、ブラウザ内で書くべきではありませんwhile(true)でループする間、ブラウザはJavaScriptの実行に専念するようになり、ユーザー入力を認識しない状態に陥ります。

setTimeoutなどを使いましょう。

投稿2020/12/22 06:48

maisumakun

総合スコア146018

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

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

0

Dat.now() は呼ばれるたびに違う値を返す(現在時刻を返す)、「副作用」のある関数と呼ばれます。副作用があるとこのように理解が難しくなるんですね。副作用には他に乱数、画面への出力、キーボードからの入力などなど、プログラミングの世界の外からやってくるもの全てが副作用です。時刻もそうですよね?

それから = というのはわかりにくいんですが、数学の = と同じではありません。これは代入を意味していて x = yxy を入れるぞ、という意味です。そのあと y が変わろうが知ったことではありません。これで Date.now() - startTime0 にならない理由がおわかりいただけたでしょうか。

最後に、return ですがこれは大域脱出と呼ばれる命令の一つです。もしこれがなければ回りくどい書き方をしなければいけません。

JavaScript

1function blockTime(timeout) { 2 const startTime = Date.now(); 3 let cond = true; 4 5 while (cond) { 6 const diffTime = Date.now() - startTime; 7 if (diffTime >= timeout) { 8 cond = false; 9 } 10 } 11}

また、JavaScript において return は値を返すという役割も果たしています。

JavaScript

1function addXY(x, y){ 2 return x + y; 3} 4 5console.log(addXY(1, 2)) // 3

以上が上記のコード + α の解説でした。上記のコード、良くないんですけどね!

投稿2020/12/22 08:36

A_kirisaki

総合スコア2853

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

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

cheetoi

2020/12/23 00:56

A_kirisakiさん、わかりやすく解説していただきありがとうございます! 私の質問の仕方が間違っておりまして、startTimeも時間が経過するごとに変化するものと誤解していて 永遠に差は縮まらないと思い込んでおりました。(Date.now() - Date.now())←昨日までの認識 またreturnの意味については非常に参考になりました。必ずしも何かを返している訳ではないのですね。 ご丁寧にありがとうございました!
guest

0

while(true)するならworkerのような処理が必要でしょう
setIntervalで十分な気もしますが・・・

投稿2020/12/22 08:00

yambejp

総合スコア116724

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

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

0

2行目にconst startTime = Date.now()と記されているのでdiffTimeの値は0たと思うのですが

...

0ではありませんでした。なぜこのような挙動になるか

Date.now()は呼んだときの時刻を返すので、呼ぶたびに値が変わります。

また7行目のreturnが何を意味しているか分からない

そこで関数を抜けます。

投稿2020/12/22 06:39

ozwk

総合スコア13553

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

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

cheetoi

2020/12/22 08:15

ozwkさん、回答ありがとうございますm(_ _)m 理解が追いつかず申し訳ありません、Date.now()とstartTimeの値は異なるとの認識で合っておりますでしょうか?仮にその前提でdiffTimeに代入されたとして、なぜtimeout以上の値になる(関数を抜ける)か解説しもらうことは可能でしょうか? 私が思ったことはdiffTimeが0とは異なる値から始まったとして、そこから値が変動するのであれば、なぜそのような挙動になるのかとの事です。 上手く説明できずすみません、またお時間ございましたらお願いします。
maisumakun

2020/12/22 08:31

> 理解が追いつかず申し訳ありません、Date.now()とstartTimeの値は異なるとの認識で合っておりますでしょうか? 最初は一致していますが、時間が進めば当然違ってきます。 > 仮にその前提でdiffTimeに代入されたとして、なぜtimeout以上の値になる(関数を抜ける)か 時間が経過していけば、差は広がる一方です。 > diffTimeが0とは異なる値から始まったとして いえ、最初は0です。
maisumakun

2020/12/22 08:37 編集

Date.now()は、数学的な関数と違って、「実行したタイミングによって結果が変わる」関数です。一方で、startTimeの値は最初に書き込まれたきりで、時間を置いても変化しません。
cheetoi

2020/12/23 00:36

maisumakunさん、ご丁寧に書いていただきありがとうございます。 >startTimeの値は最初に書き込まれたきりで、時間を置いても変化しません。 startTimeも時間が進めば変化すると思い込んでしまい差は縮まらないと詰んでおりましたが こちらの解説で理解することができました。 私の自身の誤解に気づいていただき本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問