ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클로저 (Closure)
    Javascript 2020. 4. 2. 16:49

    Closure

    Closures are nothing but FUNCTIONS WITH PRESERVED DATA

    내부함수가 외부함수의 컨텍스트에 접근할 수 있는 것을 클로저라고 합니다.
    외부함수가 실행된 후에도 내부함수가 외부함수의 컨텍스트에 접근할 수 있습니다.

     

     

    커링: 함수 하나가 n개의 인자를 받는 대신, n개의 함수를 만들어 각각 인자를 받게 하는 방법

    function adder(x) {
      return function(y) {
        return x + y;
      }
    }
    
    adder(2)(3);  //5
    
    //하나의 값을 고정시키고 계속 사용할 수 있습니다.
    let add100 = adder(100);
    add100(2);  //102
    add100(10);  //110
    
    let add5 = adder(5);
    add5(2);  //7

    외부 함수의 변수가 저장되어 마치 템플릿 함수와 같이 사용 가능합니다.

    function htmlMaker(tag) {
      let starTag = '<' + tag + '>';
      let endTag = '</' + tag + '>';
      return function(content) {
        return startTag + content + endTag;
      }
    }
    
    let divMaket = htmlMaker('div');
    divMaker('code');	// <div>code</div>
    divMaker('states');	// <div>states</div>
    
    let h1Maker = htmlMaker('h1');
    h1Maker('Headline');	// <h1>Headline</h1>

     

    클로저 모듈 패턴

    변수를 스코프 안쪽에 가두어 함수 밖으로 노출시키지 않는 방법

    function makeCounter() {
      let privateCounter = 0;
      
      let obj = {	
        increment: function() {	//객체에 대한 키값이 함수
          privateCounter++;
        },
        decrement: function() {
          privateCounter--;
        },
        getValue: function() {
          return privateCounter;
        }
      };
      
      return obj;	//함수 모음을 리턴
    }
    
    let counter1 = makeCounter();
    counter1.increment();	
    counter1.increment();	
    counter1.getValue();	//2
    
    let counter2 = makeCounter();
    counter2 = increment();
    counter2 = decrement();
    counter2.getValue();	//1
    
    //함수 내에서 privateCounter를 각각 독립적으로 가지고있기 때문에 서로 영향을 받지 않습니다. 

    프라이빗 변수를 만드는 이유

    소프트웨어가 커지게 된다면 많은 데이터가 소프트웨어 안에 존재하는데 누구나 수정할 수 있다는 의미는 그 소프트웨어가 망가질 수 있다는 의미이다. 

    'Javascript' 카테고리의 다른 글

    (loading)this  (0) 2020.04.15
    미정의 매개변수를 배열로 받는 나머지 매개변수 (Rest parameter)  (0) 2020.04.12
    데이터 타입 (data type)  (0) 2020.04.02
    재귀함수  (0) 2020.03.30
    정수 메서드 (interger method)  (0) 2020.03.30

    댓글

Designed by CHANUL