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

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

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

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

Q&A

解決済

2回答

407閲覧

グローバルスコープで宣言した変数をローカルスコープで宣言すると処理が変化するのはなぜか?

hayamin1111

総合スコア11

JavaScript

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

0グッド

0クリップ

投稿2019/08/03 01:52

上のソースコードは、グローバルスコープでiを宣言すると、2秒後にclearTimeoutによって処理が終了します。
しかし、下のソースコードのように、ローカルスコープ内でiを宣言するように変更すると、処理は止まらず延々と続きます。
なぜそのように処理に変化があるのか考えてみたのですが(下記に書いてあります)、それがあっているかどうか教えてください。もっと適切な考え方がある場合は教えていただけると助かります。

2秒後に止まるソースコード

JavaScript

1let i = 0; //iはここで宣言している 2 3 const showTime = () => { 4 console.log(new Date()); 5 let timerId = setTimeout(showTime, 1000); 6 i++; 7 if (i > 2) { 8 clearTimeout(timerId); 9 } 10 }; 11 12 showTime();

無限に続くソースコード

JavaScript

1const showTime = () => { 2 console.log(new Date()); 3 let timerId = setTimeout(showTime, 1000); 4 let i = 0; //iをここで宣言するように変更 5 i++; 6 if (i > 2) { 7 clearTimeout(timerId) 8 } 9}; 10 11showTime();

考えたこと

グロ-バルスコープで宣言した変数iはプログラム全体で使えるため、定数showTime実行にも適用される。一方、ローカルスコープで宣言した変数iはshowTimeの関数内のみであり、実行時には適用されない。つまり、showTimeを実行するときにif文が無視される、ということでしょうか?

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

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

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

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

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

kei344

2019/08/03 03:48

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
hayamin1111

2019/08/03 03:58

失礼しました。アンサーを選ばせていただきました!
guest

回答2

0

ベストアンサー

グロ-バルスコープで宣言した変数iはプログラム全体で使えるため、定数showTime実行にも適用される。一方、ローカルスコープで宣言した変数iはshowTimeの関数内のみであり、実行時には適用されない。

いえ、違います。ローカルスコープの変数は、スコープに入るたびに初期化されるのが、この事象でのポイントです。つまり、showTime関数1回の実行ごとにi = 0;が毎回実行されるので、i++があっても、永遠にi > 2の条件を満たすことはありません。

投稿2019/08/03 01:55

maisumakun

総合スコア145201

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

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

maisumakun

2019/08/03 01:58

なお、C言語のstatic変数など、関数実行を超えて存続するローカル変数も言語によってはありますが、JavaScriptにはありません。
hayamin1111

2019/08/03 03:22

なるほど!ローカルスコープ内ではiは毎回0に戻されるから、i > 2になることは一生ないってことですね!非常にわかりやすい回答をありがとうございます!
guest

0

呼ばれるたんびに

let i = 0; //iをここで宣言するように変更

0に初期化してるんだから、そうなって当然というはなしですね

投稿2019/08/03 01:56

y_waiwai

総合スコア87784

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

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

hayamin1111

2019/08/03 03:18

なるほど!毎度初期化しているから増えることはないということですな!端的な回答をありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問