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

質問編集履歴

1

追加疑問になります

2025/01/10 03:20

投稿

javastudy
javastudy

スコア11

title CHANGED
@@ -1,1 +1,1 @@
1
- 実行結果が何も表示されない理由を知りたいです
1
+ 実行結果理由を知りたいです
body CHANGED
@@ -1,20 +1,58 @@
1
- 下記のJavaScriptコードで、incrementFactory();と実行した際に、
1
+ 下記のJavaScript1コードで、incrementFactory();と実行した際に、
2
- 実行結果は(エラーが出るわけでもなく)何も表示がされないです。
3
-
4
- その理由を教えていただきたいです。
5
-
6
- 想定では、incrementFactory()のreturnで関数aが実行されるということで、
2
+ incrementFactory()のreturnで関数aが実行されるということで、
7
3
  各incrementFactory()が実行されるごとに、let num = 0;で、numが毎回初期化され、0になると思いますので、最終的な実行結果は、
8
4
  1
9
5
  1
10
6
  1
11
7
  1
12
- を想定していました。
8
+ となりました。
13
9
 
10
+ そして、JavaScript2コードでは、
11
+ ```
12
+ const fn = incrementFactory();
13
+
14
+ fn();
15
+ fn();
16
+ fn();
17
+ fn();
18
+
19
+ ```
20
+ を追記した場合の実行結果を見てみたのですが、
21
+
22
+ return a();ではエラーになり、return a;で正しく動作し、実行結果は、
23
+ 1
24
+ 2
25
+ 3
26
+ 4
27
+ となりました。
28
+
29
+ ここで2つの疑問となりますが、
30
+ なぜJavaScript1では、return a;では問題があり、return a();ではエラーが起きず、
31
+ JavaScript2では、return a;では問題がなく、return a();ではエラーが起きるのかの理由が分かりません。
32
+
33
+ 以下は、JavaScript2で、return a();と書いた場合のエラーになります。
34
+ Uncaught TypeError: fn is not a function
35
+
36
+ また、もう一つの疑問ですが、
37
+ JavaScript2の以下のコードにつきまして、
38
+
39
+ ```
40
+ const fn = incrementFactory();
41
+
42
+ fn();
43
+ fn();
44
+ fn();
45
+ fn();
46
+
47
+ ```
48
+ ↑このようにconst fnに incrementFactory();を格納しただけなのに、
49
+ なぜ、 let num = 0;の初期化は1回だけの実行という扱いにされ、
50
+ 実行結果が1 1 1 1とならず、1 2 3 4となるのかという理論がわからないです。
51
+
14
52
  よろしくお願いいたします。
15
53
 
16
54
 
17
- ```JavaScript
55
+ ```JavaScript1
18
56
 
19
57
  function incrementFactory() {
20
58
 
@@ -25,7 +63,7 @@
25
63
  console.log(num);
26
64
  }
27
65
 
28
- return a;
66
+ return a();
29
67
  }
30
68
 
31
69
  incrementFactory();
@@ -35,3 +73,36 @@
35
73
 
36
74
  ```
37
75
 
76
+
77
+ ```JavaScript2
78
+
79
+ function incrementFactory() {
80
+
81
+ let num = 0;
82
+
83
+ function a() {
84
+ num = num + 1;
85
+ console.log(num);
86
+ }
87
+
88
+ return a;
89
+ }
90
+
91
+ const fn = incrementFactory();
92
+
93
+ fn();
94
+ fn();
95
+ fn();
96
+ fn();
97
+
98
+
99
+ ```
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+ よろしくお願いいたします。
108
+