teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記1

2021/09/08 13:31

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -36,4 +36,107 @@
36
36
 
37
37
  そして、ボタンが押されたとかの処理のときに、isClicked を trueにする。
38
38
 
39
- そうすれば、「ボタンが押された( isClicked == true ) でないなら、処理する」とかみたいな事ができますね。
39
+ そうすれば、「ボタンが押された( isClicked == true ) でないなら、処理する」とかみたいな事ができますね。
40
+
41
+ -----------------------
42
+
43
+ [追記1]
44
+
45
+ > なので、それを防止すべく、変数による制御を加えてみたのですが、なぜか今まで通り再生できてしまいます。
46
+
47
+ それはね。当たり前です。
48
+
49
+ コードを読んでみましょう。
50
+
51
+ コードを読むコツは『**一行レベルで、何をしているかを考えながら読む**』です。
52
+
53
+ とりま、読んでみましょう。
54
+
55
+ ```
56
+ // 関数 startを定義
57
+ function start() {
58
+ // started が undefined なら
59
+ if (started == undefined){
60
+ // started 変数を宣言
61
+ var started;
62
+ // 音楽を再生
63
+ music.play();
64
+ // 「[再生]」と表示
65
+ console.log('[再生]');
66
+ // started 変数を宣言し、"abc" をセット
67
+ var started = "abc";
68
+ }else{ // それ以外 (=> startがundefined以外) ) なら
69
+      // 再生中
70
+ aleat("再生中...");
71
+ }
72
+ }
73
+ ```
74
+
75
+ そして、これを疑似コードとして書きだしてみましょう。
76
+
77
+ ```
78
+ 1. startedがundefinedなら
79
+ 1.1. started変数を宣言
80
+ 1.2. 音楽を再生
81
+ 1.3. started変数を宣言し、"abc"をセット
82
+ 2. それ以外なら
83
+ 2.1. 再生中
84
+ ```
85
+
86
+ この疑似コードを、現実世界で手作業でシミュレーションしてみてください。
87
+
88
+ つまり、ホワイトボードかなんかを用意して、
89
+
90
+ ```
91
+ ホワイトボードにある started とあるものを読んでundefinedかどうかを調べる
92
+ → (まだ無いようだ)=> (undefinedである)
93
+ → started == undefinedは満たす
94
+ → started という名前のものをホワイトボードに書く
95
+
96
+ [started: ???]
97
+
98
+ → 音楽を再生
99
+ → さらに別のところに started: abc と書く。
100
+
101
+ [started: ???]
102
+ [started: abc]
103
+
104
+ → また呼び出されたので startedがundifinedかどうか調べる
105
+ → (適当なものを見る)
106
+ → (undefinedだ)
107
+ → startedを宣言
108
+
109
+ [started: ???]
110
+ [started: abc]
111
+ [started: ???]
112
+
113
+ ...
114
+ ```
115
+
116
+ のような感じでしょうか。
117
+
118
+ まあ、実際には最適化が行われると思いますが。
119
+
120
+ なんか、おかしくないですか?
121
+
122
+ (1)で調べているstartedはどこにあるのでしょうか。
123
+
124
+ で、仮にグローバル変数としてあるとしても、
125
+
126
+ (1.1) でさらにローカル変数としてstartedを宣言しています。
127
+
128
+ そうなると、次に(関数内で)startedにアクセスするときは ローカル変数にアクセスするはずです。
129
+ (関数から抜けた後なら別だろうけど)
130
+
131
+ つまり、(1) ≠ (1.1) です。
132
+
133
+ さらに (1.3)でstartedを宣言し、"abc"を入れています。
134
+
135
+ そうなると、別の変数として宣言しているはずです。
136
+ (ちなみに、C言語とかのような言語だとこの時点でエラー)
137
+
138
+ それに (1.1) ≠ (1.3) です。
139
+
140
+ おそらく、「別の変数として見なされている」可能性が高いです。
141
+
142
+ varを付けると、**宣言**で、「このブロックでしか使わないもの」という感じです。