回答編集履歴

1

追記1

2021/09/08 13:31

投稿

BeatStar
BeatStar

スコア4958

test CHANGED
@@ -75,3 +75,209 @@
75
75
 
76
76
 
77
77
  そうすれば、「ボタンが押された( isClicked == true ) でないなら、処理する」とかみたいな事ができますね。
78
+
79
+
80
+
81
+ -----------------------
82
+
83
+
84
+
85
+ [追記1]
86
+
87
+
88
+
89
+ > なので、それを防止すべく、変数による制御を加えてみたのですが、なぜか今まで通り再生できてしまいます。
90
+
91
+
92
+
93
+ それはね。当たり前です。
94
+
95
+
96
+
97
+ コードを読んでみましょう。
98
+
99
+
100
+
101
+ コードを読むコツは『**一行レベルで、何をしているかを考えながら読む**』です。
102
+
103
+
104
+
105
+ とりま、読んでみましょう。
106
+
107
+
108
+
109
+ ```
110
+
111
+ // 関数 startを定義
112
+
113
+ function start() {
114
+
115
+ // started が undefined なら
116
+
117
+ if (started == undefined){
118
+
119
+ // started 変数を宣言
120
+
121
+ var started;
122
+
123
+ // 音楽を再生
124
+
125
+ music.play();
126
+
127
+ // 「[再生]」と表示
128
+
129
+ console.log('[再生]');
130
+
131
+ // started 変数を宣言し、"abc" をセット
132
+
133
+ var started = "abc";
134
+
135
+ }else{ // それ以外 (=> startがundefined以外) ) なら
136
+
137
+      // 再生中
138
+
139
+ aleat("再生中...");
140
+
141
+ }
142
+
143
+ }
144
+
145
+ ```
146
+
147
+
148
+
149
+ そして、これを疑似コードとして書きだしてみましょう。
150
+
151
+
152
+
153
+ ```
154
+
155
+ 1. startedがundefinedなら
156
+
157
+ 1.1. started変数を宣言
158
+
159
+ 1.2. 音楽を再生
160
+
161
+ 1.3. started変数を宣言し、"abc"をセット
162
+
163
+ 2. それ以外なら
164
+
165
+ 2.1. 再生中
166
+
167
+ ```
168
+
169
+
170
+
171
+ この疑似コードを、現実世界で手作業でシミュレーションしてみてください。
172
+
173
+
174
+
175
+ つまり、ホワイトボードかなんかを用意して、
176
+
177
+
178
+
179
+ ```
180
+
181
+ ホワイトボードにある started とあるものを読んでundefinedかどうかを調べる
182
+
183
+ → (まだ無いようだ)=> (undefinedである)
184
+
185
+ → started == undefinedは満たす
186
+
187
+ → started という名前のものをホワイトボードに書く
188
+
189
+
190
+
191
+ [started: ???]
192
+
193
+
194
+
195
+ → 音楽を再生
196
+
197
+ → さらに別のところに started: abc と書く。
198
+
199
+
200
+
201
+ [started: ???]
202
+
203
+ [started: abc]
204
+
205
+
206
+
207
+ → また呼び出されたので startedがundifinedかどうか調べる
208
+
209
+ → (適当なものを見る)
210
+
211
+ → (undefinedだ)
212
+
213
+ → startedを宣言
214
+
215
+
216
+
217
+ [started: ???]
218
+
219
+ [started: abc]
220
+
221
+ [started: ???]
222
+
223
+
224
+
225
+ ...
226
+
227
+ ```
228
+
229
+
230
+
231
+ のような感じでしょうか。
232
+
233
+
234
+
235
+ まあ、実際には最適化が行われると思いますが。
236
+
237
+
238
+
239
+ なんか、おかしくないですか?
240
+
241
+
242
+
243
+ (1)で調べているstartedはどこにあるのでしょうか。
244
+
245
+
246
+
247
+ で、仮にグローバル変数としてあるとしても、
248
+
249
+
250
+
251
+ (1.1) でさらにローカル変数としてstartedを宣言しています。
252
+
253
+
254
+
255
+ そうなると、次に(関数内で)startedにアクセスするときは ローカル変数にアクセスするはずです。
256
+
257
+ (関数から抜けた後なら別だろうけど)
258
+
259
+
260
+
261
+ つまり、(1) ≠ (1.1) です。
262
+
263
+
264
+
265
+ さらに (1.3)でstartedを宣言し、"abc"を入れています。
266
+
267
+
268
+
269
+ そうなると、別の変数として宣言しているはずです。
270
+
271
+ (ちなみに、C言語とかのような言語だとこの時点でエラー)
272
+
273
+
274
+
275
+ それに (1.1) ≠ (1.3) です。
276
+
277
+
278
+
279
+ おそらく、「別の変数として見なされている」可能性が高いです。
280
+
281
+
282
+
283
+ varを付けると、**宣言**で、「このブロックでしか使わないもの」という感じです。