본문 바로가기

JavaScript/2

Closure (클로저)

1. Closure (클로저) 란 ?

  가. 클래스 기반 언어처럼 캡슐화, 모듈화 작업을 수행 할 수 있습니다.

  나. 클로저는 함수와 함수가 선언된 어휘적 환경의 조합입니다.

  다. 함수 밖에서 선언된 변수함수 내부에서 사용할 때를 말합니다.

 

function outerFn() {

    let outerVar = 'outer';

    console.log(outerVar);

 

    function innerFn() {

        let innerVar = 'inner';

        console.log(innerVar);

    }    //  innerFn()  이 부분이 클로저 함수입니다.

         // 이 함수 안에는 지역 변수(innerVar), 외부 함수의 변수(outerVar), 전역변수(globalVar)의 접근이 전부 가능합니다.

    return innerFn;

}

 

let globalVar = 'global';

let innerFn = outerFn();

innerFn();   //  inner

 

또 다른 예제를 보겠습니다.

 

function adder(x) {

    return function(y) {

        return x + y;

    }

}

adder(2)(3);  // 5

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

 

 

function htmlMaker(tag) {

    let startTag = '<' + tag + '>';

    let endTag = '</' + tag + '>';

    return function(content) {

        return startTag + content + endTag;

    }

}

 

 

let divMaker = htmlMaker('div');

divMaker('Java');  // <div>Java</div>

divMaker('Script');  // <div>Script</div>

 

let h1Maker = htmlMaker('h1');

h1Maker('HeadLine');  //  <h1>HeadLine</h1>

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

 

 

function makeCounter() {

    let privateCounter = 0;

 

    return {

        increment: function() {

            privateCounter++;

        },

        decrement: function() {

            privateCounter--;

        },

        getValuet: function() {

            return privateCounter;

        }

     }

}

 

let counter1 = makeCounter();

counter1.increment();

counter1.increment();

counter1.getValue();  //  2

 

let counter2 = makeCounter();

counter2.increment();

counter2.decrement();

counter2.increment();

counter2.getValue();  // 1

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

 

 

 

이상으로 Closure(클로저)에 대해서 알아보았습니다.

'JavaScript > 2' 카테고리의 다른 글

TDD(test-driven development) (테스트 주도 개발)  (0) 2020.05.13
Scope (스코프)  (0) 2020.05.10
개발자 도구 (Git)  (0) 2020.05.10
알고리즘(재귀함수)  (0) 2020.04.02