배경
콜백과 클로저는 JavaScript를 배우거나 OpenGL에서 본 개념이다.
계속은 The Little Schemer에서 본 개념인데 너무 헷갈려서 정리해 놓는다.
계속 때문에 머리가 터질 것 같다
참조
포인트
콜백
- 함수에 인자로 넘겨지는 함수
- 함수에 인자로 넘겨지므로써 그 함수에 따른 기능을 하도록 한다.
- ex) Nodejs에서 req res에서의 콜백, OpenGL에서의 keyfuc콜백
클로저
- 클로저는 함수가 선언될 당시의 환경을 기억했다가 나중에 호출되었을때 원래의 환경에 따라 수행되는 함수이다.
계속
- actor(lamda function)가 값과 처리방식을 다음 actor에 넘겨준다.
- 다음 actor은 값을 다른 actor에 넘겨주거나 처리하거나 할 수 있다.
콜백
예시
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function MainProgram { var arg; LibFunc(arg, CallbackFunc); } function CallbackFunc(result) { } function LibFunc(arg, callback) { var data; callback(data); }
|
클로저
예시
1 2 3 4 5 6 7 8 9 10 11 12 13
| function outer() { var x=0; return function() { return ++x; } } var x=-1; var f= outer(); console.log(x); console.log(f()); console.log(f()); console.log(f());
|
예시2 : 초기화
1 2 3 4 5 6 7 8 9 10 11 12 13
| function outer() { var x=0; return function(){ return ++x; } } var x=-1; outer(); console.log(x); console.log(outer()()); console.log(outer()()); console.log(outer()());
|
예시3 : 클로저 인스턴스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function outer() { var x=0; return function() { return ++x; } } var x=-1; var f= outer(); var g= outer(); console.log(x); console.log(f()); console.log(f()); console.log(f()); console.log(g()); console.log(g()); console.log(g());
|
클로저는 비공개 내부 변수를 갖는 함수 인스턴스 생성자이다.
클로저로 생성한 독립된 변수 공간을 가진 인스턴스를 클로저 인스턴스라고 한다.
Q) 근데 결국 클로저를 어따가 쓰는거지?
계속
1 2 3 4 5
| (define fact (lambda n c) (if (= n c 1 ) (fact (- n 1) (lambda (a) (c (* n a)))))))
|