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

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

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

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

Q&A

解決済

4回答

476閲覧

javascript setTimeout

chako_2007

総合スコア34

JavaScript

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

1グッド

1クリップ

投稿2020/07/31 09:24

javascript

1<script> 2 3 //処理1 4 setTimeout(console.log('hoge'),4000); 5 6 //処理2 7 var hyouji = function(){ 8 console.log('hoge'); 9 } 10 setTimeout(hyouji,4000); 11 12</script>

javascriptの初歩的な質問なのですが、
上記処理1と処理2でコンソールにhogeが出るタイミングが違う理由がわかりません。

プログラムの結果
処理1は画面を開いたときにhogeがでる。
処理2は指定時間後にhogeがでる。

setTimeoutは指定時間後に処理をしますよね。
でしたら、処理1は処理2と同様に指定時間後にhogeが出ると思うのですが、違いますか?

DrqYuto👍を押しています

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

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

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

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

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

guest

回答4

0

setTimeoutは渡された関数を実行するので、「処理1」はconsole.log('hoge')の実行結果が関数を返さないので指定秒数後に何も実行されません。

括弧が付いたらその場で実行しますよ。

js

1setTimeout(hyouji ,4000); // 4000後 2setTimeout(hyouji(),4000); // その場で実行

投稿2020/07/31 09:30

編集2020/07/31 13:19
kei344

総合スコア69606

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

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

m.ts10806

2020/07/31 09:48

病 になってます
kei344

2020/07/31 13:19

To: m.ts10806さん 指摘ありがとうございます、修正しておきます。
guest

0

ベストアンサー

式を解釈することをプログラミング用語で「評価」というのですが、setTimeoutの引数は即座に評価されます。

js

1setTimeout(console.log('hoge'),4000);

↑を評価すると、console.log()が即座に実行されコンソールにhogeが表示され、その戻り値は常にundefinedなので↓になります。

js

1setTimeout(undefined,4000);

一方で、

js

1setTimeout(hyouji,4000);

↑を評価すると、変数hyoujiの中身は関数なので↓となりますが、hyouji()などのように関数を実行しているわけではないのでコンソールには表示されません。

js

1setTimeout(function(){ 2 console.log('hoge'); 3 },4000);

↓ならば、即座にコンソールにhogeが表示されます。

js

1setTimeout(hyouji(),4000);

投稿2020/07/31 09:33

Lhankor_Mhy

総合スコア36960

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

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

chako_2007

2020/08/02 07:20

↑を評価すると、変数hyoujiの中身は関数なので↓となりますが、 hyouji()などのように関数を実行しているわけではないのでコンソールには表示されません。 と答えてくれましたが、 setTimeout(hyouji,4000); hyoujiは変数ですが、変数中身は関数なので setTimeout(hyouji(),4000); これとまったく同じになるのではないでしょうか?
Lhankor_Mhy

2020/08/02 09:14 編集

つまり、たとえば、 alert() と alert とが、同じ結果になる、というお考えなのですね。 試してみればすぐにわかるのですが、残念ながら、それは違います。 前者はアラートが表示され、後者はアラートが表示されません。 --- 変数名の後ろに ( が記されている場合、それは関数呼び出しとして評価されます。 変数の中身が関数であろうとなかろうと、ともかくその変数に対して関数呼び出しをしようとします。 --- 逆に言うと、そして大雑把に言うと、変数の後ろに ( がない場合、変数の中身が何であろうと、関数呼び出しとして評価されない、ということです。(一部に例外がありますが)
chako_2007

2020/08/10 02:16

返信遅くなって、すいません。 なんとなく理解できたので、返信してもらえなくても大丈夫です。 逆に言うと、そして大雑把に言うと、変数の後ろに ( がない場合、変数の中身が何であろうと、関数呼び出しとして評価されない、ということです。(一部に例外がありますが) のコメントについてですが、 setTimeout(hyouji,4000); たしかに、hyoujiは関数として呼び出しされませんね。 hyoujiは展開されて setTimeout(function(){ console.log('hoge'); },4000); となるだけで。 -------------------------------------------------------------------------------------- 各処理の実行を説明すると setTimeout(console.log('hoge'),4000); //console.log()関数を実行してから、4秒まつ。 setTimeout(hyouji(),4000); //hyouji()関数を実行してから、4秒まつ setTimeout(hyouji,4000); //これの中身は↓なので setTimeout(function(){ console.log('hoge'); },4000); //4秒まってから、function()を実行する。 //hyoujiを展開 → 4秒まつ → function()を実行する。 // function()は優先順位低いのかな??
Lhankor_Mhy

2020/08/10 04:38

まさにご理解の通りです。
Lhankor_Mhy

2020/08/10 16:20

// function()は優先順位低いのかな?? ここが気になったので、追加でコメントします。 たとえば、 setTimeout(console.log,4000); とすれば、4秒後にコンソールに空文字列が表示されますし、 setTimeout(alert,4000); とすれば、4秒後にアラートが表示されます。 function(){} つまり関数式が、ビルトイン関数に比べて優先順位が低い、ということではありません。
guest

0

コールバックを指定する必要があるのでこう書きます

javascript

1setTimeout(()=>console.log('hoge'),4000);

投稿2020/07/31 09:57

yambejp

総合スコア116724

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

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

0

ご質問の処理1は以下のように考えてください。

javascript

1//setTimeout(console.log('hoge'),4000); 2// 以下の処理と同じ 3console.log('hoge'); 4setTimeout(undefined,4000); // setTimeout の返却値である timeoutId がカウントアップされる
  • MDN console.log() 返却値なし(undefined
  • MDN setTimeout() に示される3つめの例文(code が何もない)になります。

投稿2020/08/10 10:01

AkitoshiManabe

総合スコア5434

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問