반응형



javascript : 클로저와 private 멤버 유사 처리


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
41
42
43
44
45
46
47
48
  
function adds(callback) {
 
 
 
    var ccount = 0;
 
    var state = function() {        //.js 에서는 지역 변수가 fuction 안에 들어 있게 되면 ccount 변수 또한 함께 남게 된다
 
        console.log('=====    ' + ccount);
 
        ccount += 1;
 
    }
 

    state();
 
    callback();
 
    return state;

}
 
 
 
 
 
//rrr 로 받게 되면 인스턴스처럼 메모리에 남게됨
 
var rrr = adds(function () { console.log('inner '); })              //실행 후  ccount = 1 , log 로 찍힌 것은 0
 
 
 
console.log(rrr());              //실행 후  ccount = 2 , log 로 찍힌 것은 1
 
console.log(rrr());              //실행 후  ccount = 3 , log 로 찍힌 것은 2
 
console.log(adds(function () { console.log('inner '); }));
 
console.log(adds(function () { console.log('inner '); }));
 
 
cs



[결과 화면] 


Debugger listening on ws://127.0.0.1:48101/07b14ac8-e1ae-42c5-b370-74ffca833f4d

For help see https://nodejs.org/en/docs/inspector

Debugger attached.

(node:5908) [DEP0062] DeprecationWarning: `node --inspect --debug-brk` is deprecated. Please use `node --inspect-brk` instead.



=====    0

inner

=====    1

undefined

=====    2

undefined

=====    0

inner

[Function: state]

=====    0

inner



[Function: state]

Waiting for the debugger to disconnect...





....  문법이 편리? 하긴 하지만 지역 변수 및 스택 메모리 구조를 이해하고 좀더 OS 적인 체계의 생각이 있는 사람들에게는

지역 변수의 메모리 영역들에서 문법으로 인하여 객체화 된다는 것이 뭔가 억지스러움이 묻어있다고 느낄 수 있는 부분일 수도 있다







클로저의 활용


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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
//객체를 리턴 하는데 인자로 받은 title 이 캡쳐 됨으로 클로저를 통하여 
//title 은 ghost, matrix 변수에서 각각 독립적으로 남게된다
 
function factory_movie(title) {
    return {
        get_title: function () {
            return title;
        },
        set_title: function (_title) {
            title = _title
        }
    }
}
ghost = factory_movie('first ghost');
matrix = factory_movie('second maxtirx');
 
console.log(ghost.get_title);
console.log(ghost.get_title());
 
console.log(ghost.get_title());
console.log(matrix.get_title());
 
ghost.set_title('ovvvvvvvv');
 
console.log(ghost.get_title());
console.log(matrix.get_title());
 
console.log('\n===========\n');
 
 
//즉시 실행함수 예 
var ssss;
(ssss=function(dd) {
    console.log(dd);
})(10);
 
//즉시 실행함수의 다른 응용 예
ssss(30);
 
console.log('\n===========\n');
 
 
//클로저를 활용한 지역 값 저장 예
var arr = [];
for (var i = 0; i < 5; i++)
{
    arr[i] = function (id) {
                    return function () { return id; }
             }(i);
}
 
for (var index in arr) {
    console.log(arr[index]());
}




결과화면





ghost.get_title() 를 호출하게 되면  ghost private 멤버변수 값인(정확히는 클로저에 묶인 객체안의 함수내의 title 변수)
'first ghost' 을 리턴 받을 수 있게된다






반응형

+ Recent posts