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

回答編集履歴

1

修正

2020/05/12 11:54

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -10,4 +10,68 @@
10
10
  console.log(d);
11
11
  ```
12
12
 
13
- きちんと値が入ったタイミングで計算してください。
13
+ きちんと値が入ったタイミングで計算してください。
14
+
15
+
16
+ # ミニマムコードで解説。
17
+
18
+ もっと簡単なコードで紐解きましょう。
19
+
20
+ 下記のコード、出力結果は「undefined」です。
21
+ ```js
22
+ let a;
23
+ let b;
24
+
25
+ b = a;
26
+ test();
27
+ function test(){
28
+ a = "test";
29
+ console.log(b);
30
+ }
31
+ ```
32
+ でも質問者さんは「なぜ`test`が出ないの?」と言っています・
33
+
34
+ では処理はどの順番で通っているか確認しましょう。
35
+
36
+ ```js
37
+ console.log(1);
38
+ let a;
39
+ console.log(2);
40
+ let b;
41
+ console.log(3);
42
+ b = a;
43
+ console.log(4);
44
+ test();
45
+ console.log(5);
46
+ function test(){
47
+ console.log(6);
48
+ a = 2;
49
+ console.log(7);
50
+ console.log(b);
51
+ console.log(8);
52
+ }
53
+ console.log(9);
54
+ ```
55
+ 出力結果
56
+ ```
57
+ 1
58
+ 2
59
+ 3
60
+ 4
61
+ 6
62
+ 7
63
+ undefined
64
+ 8
65
+ 5
66
+ 9
67
+ ```
68
+
69
+ 質問者さんの理論を成り立たせるためには、7の次に1~4をもう1度通っている必要があります。
70
+ でも、通ってませんね?
71
+ bに値が代入されたのはグローバルで実行された3と4の間のみです。
72
+
73
+ 提示のコードでは、startTimeやelapsedTimeは宣言後に、明確に値が代入されるように書かれています。
74
+ しかも、setTimeoutを実行しているため、countUp()が何度も実行され、elapsedTimeは更新され続けていることになります。
75
+ 私のサンプルコードと同じようにあらゆる箇所にconsole.log()で出力させてみてください。
76
+ クリック前に、変数定義部分を通り、クリックしたら`startTime=Date.now();`が一度だけ実行された後は下記が延々と繰り返されているはずです。
77
+ `elapsedTime=Date.now();の代入`→`console.log(d);でNaN出力`→`setTimeout(countUp , 10);`