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

回答編集履歴

7

⑤を復帰値に変更

2020/01/15 13:18

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -41,4 +41,4 @@
41
41
  increment(); //4 : 別の変数であることの確認
42
42
  ```
43
43
 
44
- ![イメージ説明](65ffe4da7b4596a308932a8ed06e940e.png)
44
+ ![クロージャー処理の流れ](1251ef69b6ee3f074b8b2c69bb1ffd9e.png)

6

水色番号追加

2020/01/15 13:18

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -41,4 +41,4 @@
41
41
  increment(); //4 : 別の変数であることの確認
42
42
  ```
43
43
 
44
- ![イメージ説明](81924f2a12b71f6660d674c8eb52e4d0.png)
44
+ ![イメージ説明](65ffe4da7b4596a308932a8ed06e940e.png)

5

図を追記

2020/01/15 11:38

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -39,4 +39,6 @@
39
39
  increment2(); //2
40
40
 
41
41
  increment(); //4 : 別の変数であることの確認
42
- ```
42
+ ```
43
+
44
+ ![イメージ説明](81924f2a12b71f6660d674c8eb52e4d0.png)

4

コードにコメント追加

2020/01/15 11:32

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -29,13 +29,13 @@
29
29
  return do_increment // 変数countを抱えた do_increment関数オブジェクトを返す
30
30
  }
31
31
 
32
- let increment = make_increment();
32
+ let increment = make_increment(); // make_increment関数を呼び出して do_increment 関数を作り increment変数に代入
33
33
  increment(); //1
34
34
  increment(); //2
35
35
  increment(); //3
36
36
 
37
- let increment2 = make_increment();
38
- increment2(); //1 : increment とは別の領域に count変数と do_increment関数られ
37
+ let increment2 = make_increment(); // increment とは別の count変数と do_increment関数作る
38
+ increment2(); //1
39
39
  increment2(); //2
40
40
 
41
41
  increment(); //4 : 別の変数であることの確認

3

コードにコメント追加

2020/01/15 11:06

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -17,16 +17,16 @@
17
17
  make_increment() を呼び出すごとに 変数 count 領域と do_increment 関数オブジェクト が作られます。
18
18
 
19
19
  ```javascript
20
- function make_increment () {
20
+ function make_increment () { // 関数定義により関数オブジェクトが作られる
21
- let count;
21
+ let count; // 関数を呼び出すと変数領域が作られる
22
22
 
23
- function do_increment () {
23
+ function do_increment () { // 関数定義により関数オブジェクトが作られる
24
- count += 1;
24
+ count += 1; // do_increment() を呼び出したときに +1 される
25
25
  console.log(count);
26
26
  }
27
27
 
28
- count = 0;
28
+ count = 0; // make_increment() を呼び出したときに代入する
29
- return do_increment
29
+ return do_increment // 変数countを抱えた do_increment関数オブジェクトを返す
30
30
  }
31
31
 
32
32
  let increment = make_increment();

2

名前付き関数に書き換えた例を追記

2020/01/15 10:53

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -8,4 +8,35 @@
8
8
 
9
9
  次に、`increment()` でクロージャー(内側のfunction) を呼び出すと `count+=1;` を実行して、外部変数countが `1` に変わり、`return count;` で 1 が帰ります。
10
10
  更に、`increment()` でクロージャー(内側のfunction) を呼び出すと `count+=1;` を実行して、外部変数countが `2` に変わり、`return count;` で 2 が帰ります。
11
- 更に、`increment()` でクロージャー(内側のfunction) を呼び出すと `count+=1;` を実行して、外部変数countが `3` に変わり、`return count;` で 3 が帰ります。
11
+ 更に、`increment()` でクロージャー(内側のfunction) を呼び出すと `count+=1;` を実行して、外部変数countが `3` に変わり、`return count;` で 3 が帰ります。
12
+
13
+ ---
14
+
15
+ 即時関数を名前付き関数にしてみました。
16
+ こうすることで、make_increment() を何度も呼び出せます。
17
+ make_increment() を呼び出すごとに 変数 count 領域と do_increment 関数オブジェクト が作られます。
18
+
19
+ ```javascript
20
+ function make_increment () {
21
+ let count;
22
+
23
+ function do_increment () {
24
+ count += 1;
25
+ console.log(count);
26
+ }
27
+
28
+ count = 0;
29
+ return do_increment
30
+ }
31
+
32
+ let increment = make_increment();
33
+ increment(); //1
34
+ increment(); //2
35
+ increment(); //3
36
+
37
+ let increment2 = make_increment();
38
+ increment2(); //1 : increment とは別の領域に count変数と do_increment関数が作られる
39
+ increment2(); //2
40
+
41
+ increment(); //4 : 別の変数であることの確認
42
+ ```

1

説明追記

2020/01/15 10:48

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -3,8 +3,8 @@
3
3
  インタープリタの気持ちになって処理を追ってみましょう。
4
4
  まず、最初の`function`で即時関数を作ります。
5
5
  この時点では `let count=0;` は実行されません。
6
- increment に代入するときの最後が `();` になっていて即時関数を呼び出しています。
6
+ 変数`increment` に代入するときの処理の最後の部分が `();` になっていて即時関数を呼び出しています。
7
- `let count=0;` を実行して変数`count`が`0`になり、その変数`count`を参照する内側の即時関数functionを作って return し、その即時関数が外部変数`count`を抱えた・閉じ込めた・クローズしたクロージャーとなって変数`increment`に代入されます。
7
+ この呼び出しによって `let count=0;` を実行して変数`count`が`0`になり、その変数`count`を参照する内側の即時関数functionを作って return し、その即時関数が外部変数`count`を抱えた・閉じ込めた・クローズしたクロージャーとなって変数`increment`に代入されます。
8
8
 
9
9
  次に、`increment()` でクロージャー(内側のfunction) を呼び出すと `count+=1;` を実行して、外部変数countが `1` に変わり、`return count;` で 1 が帰ります。
10
10
  更に、`increment()` でクロージャー(内側のfunction) を呼び出すと `count+=1;` を実行して、外部変数countが `2` に変わり、`return count;` で 2 が帰ります。