1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| // returnClosureClosure는 Outer 클로저를 리턴하는 Inner 클로저를 리턴
const returnClosureClosure = () => {
let _outer_state;
// _outer_state을 상태로 갖는 Outer closure를 리턴
return () => {
let _inner_state;
if (!_outer_state) {
_outer_state = 1;
} else {
++_outer_state;
}
// _outer_state와 _inner_state를 모두 상태로 갖는 Inner closure를 리턴
return () => {
if (!_inner_state) {
_inner_state = 1;
} else {
++_inner_state;
}
return {
'outer': _outer_state,
'inner': _inner_state
}
};
}
};
const returnClosure = returnClosureClosure(); // { 'outer': 0, 'inner': 0 }
let closure1;
closure1 = returnClosure(); // { 'outer': 1, 'inner': 0 }
closure1 = returnClosure(); // { 'outer': 2, 'inner': 0 }
console.log(closure1()); // { 'outer': 2, 'inner': 1 }
console.log(closure1()); // { 'outer': 2, 'inner': 2 }
console.log(closure1()); // { 'outer': 2, 'inner': 3 }
|