ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Closure (클로져)
    concept/javascript 2020. 4. 2. 21:38

     

    클로저 : 외부 함수의 변수에 접근할 수 있는 내부 함수

    (또는 이러한 작동 원리를 일컫는 용어)

    • 클로저 함수 안에서는 지역 변수 (innerVar), 외부 함수의 변수(outerVar), 전역 변수(GlobarVar)의 접근이 전부 가능

       

    function outerFn(){ 
    let outerVar = 'outer'; 
    console.log(outerVar);
    
    function innerFn(){ 
    let innerVar = 'inner'; 
    console.log(innerVar); 
    } // --> innerFn은 클로저 함수 
    return innerFn;
    }
    
    outerFn() // --> 'outer'
    outerFn()() // --> 'outer' 'inner'
    let innerFn = outerFn(); // --> 'outer'
    innerFn() // --> 'inner'

     

    그래서 이 클로저를 어디에 쓰느냐?

     


    유용한 클로저 예제

     

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

    function adder(x){ 
    return function(y){ 
      return x + y; 
      } 
    } 
    adder(2)(3); // 5 
    let add100 = adder(100); 
    // ** 장점 ** x 값을 고정해놓고 재사용할 수 있다. 
    add100(2); // 102 
    add100(10); // 110

    ⇒ 템플릿 함수로 쓸 수 있다. (html에서 유용)

     

    function htmlMaker(tag){
      let startTag = '<' + tag + '>';
      let endTag = '</' + tag + '>';
      return function(content){
        return startTag + content + endTag;
      }
    }
    
    let divMaker = htmlMaker('div'); // --> function(content){ ... }
    divMaker('안녕하세요'); // --> "<div>안녕하세요</div>

     

    클로저 모듈 패턴 : 변수를 스코프 안쪽에 가두어 함수 밖으로 노출시키지 않는 방법

    function makeCounter(){
      let privateCounter = 0;
    
      return {
        increment : function() {
          privateCounter++;
        },
        decrement : function() {
          privateCounter--;
        },
        getValue : function() {
          return privateCounter;
        }
      }
    }
    
    /*
    point1!
    이 때 privateCounter을 함수 밖에서 수정할 수 없다.
    이 특성을 용이하게 활용 가능
    */
    // 위 함수에 따른 문제
    let counter1 = makeCounter();
    counter1.increment();
    counter1.increment();
    counter1.getValue(); // 2
    
    let counter2 = makeCounter();
    counter2.increment();
    counter2.decrement();
    counter2.increment();
    counter2.getValue(); // 1
    
    /*
    point2!
    counter1 과 counter2의 privateCounter 변수를
    각각 다르게 가질 수 있기 때문에 재사용이 가능하다.
    (클로저 모듈 패턴)
    */

    'concept > javascript' 카테고리의 다른 글

    Parameter  (0) 2020.04.02
    객체 지향 JavaScript (Class)  (0) 2020.04.02
    Scope (스코프)  (0) 2020.04.02
    [ ] === [ ] // false? 참조 타입(reference type)이란?  (0) 2020.03.31
    for 문 / while 문의 차이  (0) 2020.03.31

    댓글

Designed by Tistory.