K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2257] 完全初心者のためのプログラミング入門 lesson04_4
投稿者:Hiroyuki Naito
2021/11/22 21:20:38

お世話になります。 首記のプログラムで1つ質問をさせていただきますので、よろしくお願いいたします。 JavaScriptでは同じ変数と2度宣言すると、 Uncaught SyntaxError: Identifier 'x' has already been declared というエラーが発生します。 しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 エラーにならないのは何故でしょうか。 19: for (;;) { 20: for (let x = 0; x <= 720; x += 10) { 21: context.drawImage(ufoImage, x, 10); 22: } 23: for (let x = 720; x >= 0; x -= 10) { 24: context.drawImage(ufoImage, x, 10); 25: } 26: }
[この投稿を含むスレッドを表示] [この投稿を削除]
[2258] Re:完全初心者のためのプログラミング入門 lesson04_4
投稿者:(ぱ)こと管理人
2021/11/23 20:02:16

>しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 >エラーにならないのは何故でしょうか。 これは、letで宣言された変数は、ブロックスコープを持つからです。 for文の第1式で宣言された変数は、for文のブロックの中だけのスコープを持ちます。 よって、以下のプログラムは、 for (let i = 0; i < 10; i++) { console.log("i.." + i); } console.log("i.." + i); 「i..0」から「i..9」までは表示しますが、最後の、for文の後のconsole.log()の ところで、以下のエラーを出します。 Uncaught ReferenceError: i is not defined https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let | let 文はブロックスコープのローカル変数を宣言します。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for | let で宣言された変数は文内のローカル変数になります。 このあたりは、JavaとかC++とかC#とかC99とかと同じで、JavaScriptもletが導入されて ようやく「普通の言語になった」感があります。 昔のJavaScriptではvarしか使えませんでしたが、varによる変数宣言は関数スコープで、 クロージャという仕組みと相俟って、初心者には訳の分からない結果を出すことが ありました…… 例) https://teratail.com/questions/205789
[この投稿を含むスレッドを表示] [この投稿を削除]
[2259] Re:完全初心者のためのプログラミング入門 lesson04_4
投稿者:Hiroyuki Naito
2021/11/23 23:23:51

ご回答ありがとうございました。 varからletに変わってスコープが有効になるというのは知識としてはあったのですが、関数のスコープしか頭に入っていませんでした。while文やfor文のブロックスコープも有効になるということをご教授いただき、自分の知識も一段深まった気がいたします。 >>しかし、下記の2つのfor文でxについて2回宣言しているように思うのですが、 >>エラーにならないのは何故でしょうか。 > >これは、letで宣言された変数は、ブロックスコープを持つからです。 >for文の第1式で宣言された変数は、for文のブロックの中だけのスコープを持ちます。
[この投稿を含むスレッドを表示] [この投稿を削除]