코어자바스크립트 5장<클로저>

김정현·2021년 1월 22일
0
post-thumbnail

1. 클로저

  • 외부함수의 변수를 참조하는 내부함수가 외부로 전달될 경우 외부함수가 종료되어도
    참조되는 변수가 메모리에서 살아있는 현상 → GC의 대상이 되지는 않는다.
1 var outer = function() {
2 		var a = 1;
3		  var inner = function() {
4 				return ++a;
5	 	  };
6 		return inner;
7 };
8 
9  var outer2 = outer();
10 console.log(outer2());      //2
11 console.log(outer2());      //3
  • 6번째 줄에서 inner 함수 자체를 반환했다.
  • 8번째 줄에서 outer2변수가 outer함수의 실행을 통해 반환된 inner함수를 참조합니다.
  • inner함수의 실행컨텍스트는 아래와 같습니다.→ enrivonmentRecord : { }
    → outerEnvironmentRecord : { (선언된 시점) == outer 함수의 Lexical Environment}
  • 9,10번째 줄에서 함수를 실행하면 스코프체인을 통해 outer함수의 Lexical Environment의 a변수에 접근합니다.
  • outer함수가 종료되었음에도 Lexical Environment에 접근할 수 있는 이유는 변수 a를 inner함수가 참조하고 있고 이 inner함수를 outer2변수가 참조하고 있기 때문입니다. GC는 참조되고 있는 대상을 수집대상에서 제외합니다.

2. 클로저와 메모리 관리

  • 클로저는 참조 되는 변수를 메모리에 살아있게 한다. 더 이상 해당 변수가 필요하지 않은 시점에서
    Reference Count0으로 만들어 GC의 대상이 되도록 만들어주어야 한다.
    null 이나 undefined 를 할당 해준다.

3. 접근 권한 제어(정보은닉)

  • 정보은닉은 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현대 프로그래밍 언어의 중요한 개념중 하나 이다.
  • 접근 권한 제어에는 보통 public , private , protected 3종류가 있다.
  • 자바스크립트에서는 변수 자체에 이러한 접근제한자를 붙여 권한을 제어할 수 없다.
    → 따라서, 클로저 + return 을 사용하여 publicprivate 의 권한을 구분할 수 있다.

4.커링 함수

  • 여러개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게
    체인형태로 구성한 것으로 마지막 인자가 전달되기 전까지 원본 함수가 실행되지 않는다.
1 var curry5 = function(func){
2     return function(a) {
3         return function(b) {
4             return function(c) {
5                  return function(d) {
6                       return function(e) {
7                           return func(a,b,c,d,e);
8                        };
9                  };
10           };
11      };
12 };
13
14 var getMax = curry(Math.max);
15 console.log(getMAx(1)(2)(3)(4)(5));

화살표 함수로 간결하게 표현

var curry5 = func => a => b => c => d => e =>func(a, b, c, d, e);
  • 당장 필요한 정보만 받아서 전달하고 또 필요한 정보가 들어오면 전달하는 식으로 하면
    결국 마지막 인자가 넘어갈 때 까지 함수 실행을 미루는 셈이 된다.
    이를 함수형 프로그래밍에서는 지연실행 이라고 한다.

0개의 댓글