回答編集履歴
1
追記1
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を付けると、**宣言**で、「このブロックでしか使わないもの」という感じです。
|