回答編集履歴
7
⑤を復帰値に変更
answer
CHANGED
@@ -41,4 +41,4 @@
|
|
41
41
|
increment(); //4 : 別の変数であることの確認
|
42
42
|
```
|
43
43
|
|
44
|
-

|
6
水色番号追加
answer
CHANGED
@@ -41,4 +41,4 @@
|
|
41
41
|
increment(); //4 : 別の変数であることの確認
|
42
42
|
```
|
43
43
|
|
44
|
-

|
5
図を追記
answer
CHANGED
@@ -39,4 +39,6 @@
|
|
39
39
|
increment2(); //2
|
40
40
|
|
41
41
|
increment(); //4 : 別の変数であることの確認
|
42
|
-
```
|
42
|
+
```
|
43
|
+
|
44
|
+

|
4
コードにコメント追加
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();
|
37
|
+
let increment2 = make_increment(); // increment とは別の count変数と do_increment関数を作る
|
38
|
+
increment2(); //1
|
39
39
|
increment2(); //2
|
40
40
|
|
41
41
|
increment(); //4 : 別の変数であることの確認
|
3
コードにコメント追加
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
名前付き関数に書き換えた例を追記
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
説明追記
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 が帰ります。
|