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' 을 리턴 받을 수 있게된다
반응형
'서버(Server) > Server' 카테고리의 다른 글
javascript : 함수를 Apply 로 호출하기, javascript 에서 함수는 일종의 객체이다 (0) | 2018.04.20 |
---|---|
javasript : 가변 인자와 유사한 argument 개체 (0) | 2018.04.20 |
javascript : 함수가 아닌 곳에서의 변수는 전역변수로 생성된다 for, if 문 안의 변수 또한 ... (0) | 2018.04.20 |
javascript : 변수 타입과 typeof , 6가지 타입 (0) | 2018.04.20 |
javascript : null 과 undefined (0) | 2018.04.20 |