클로저 이해하기

클로저 이해하기

Dec 09, 2018    

클로저(Closure)

클로저는 자바스크립트를 배우면 후반부에 만나는 단어이다. 하지만 자바스크립트에만 존재하는 개념은 아니다.

위키백과를 보면 클로저는 내가 이해하기 어려운 단어들로 쓰였다.

클로저는 일급 함수 개념이 있는 언어에서 렉시컬 스코프 네임 바인딩을 적용하는 테크닉이다. 클로저는 함수를 환경과 함께 저장한 레코드이며, 클로저가 생성될 때, 함수의 자유 변수 (지역적으로 사용되지만, 함수를 에워싼 스코프에서 정의됨)를 각각의 값이나 레퍼런스를 매핑하여 하나의 환경으로 만든다. 그래서 클로저는 일반 함수와 달리 스코프 바깥에 있더라도 captured variables (클로저가 생성될 때의 자유 변수들)에 클로저가 카피한 값이나 레퍼런스로 접근하는 것을 허용한다.

글만으로 이해하기 힘드니 코드를 보자.

  • 예제 코드(JavaScript)
function add(a) {
    return function foo(b) {
        return a + b;
    }
}

var add5 = add(5);
console.log(add5(5)); // 10

add 함수는 어떤 인자 a를 받아서 ‘b 인자를 받아 a와 더해주는 함수 foo를 리턴하는 고차 함수이다. 이때 foo는 렉시컬 스코프 내에 있는 a 값을 캡처해서 클로저를 생성한다. 클로저는 foo 함수에 대한 레퍼런스를 가지고 있고, foo를 둘러싼 환경-a에 특정 값이 적용되어 클로저가 생성됐을 때의 add함수 환경을 가지고 있다.

이로 인해 5를 더해주는 함수 add5는 이미 스코프를 벗어나버린 a=5add5가 소멸할 때까지 어딘가에 저장해뒀기 때문에 add5에 5를 더한 값을 리턴할 수 있다.

참고