클로저(Closure)

이나영·2021년 12월 7일

JavaScript

목록 보기
8/8

1. 클로저란?

MDN 정의에 따르면 다음과 같다.

"클로저는 함수와 그 함수가 선언될 당시의 lexical environment의 상호관계에 따른 현상"

한번에 와닿지 않아 다른 글을 가져와봤다.

자신이 생성될 때의 스코프에서 알 수 있었던 변수들 중 언젠가 자신이 실행될 때 사용할 변수들만을 기억하여 유지시키는 함수

[출처: 유인동, 《함수형 자바스크립트 프로그래밍》, 인사이트(p31)]

2. 이해하기 쉬운 기초 형태

var outer = function() {
    var a = 1;
    var inner = function() {
        return ++a;
    };
    return inner;
}

var outer2 = outer();

console.log(outer2()); //2
console.log(outer2()); //3

본래 함수는 콜스택 흐름에 따르면 실행 종료후 실행 컨텍스트가 사라지고 가비지 컬렉팅에 의하여 메모리에서 삭제되어야한다.

그러나 위 코드를 보면 내부변수인 a는 사라지지 않고 그 값을 유지하며 계속 영향력을 행사하고 있다.

아직은 더 쓸모가 있다고 판단되기 때문에 가비지 컬렉팅이 안 없애고 마음넓게 남겨준 셈이다.

3. 재정립

이처럼 클로저란 "어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우, A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상"을 말한다.

4. 사용처

다른 사용법들도 있지만 가장 단적으로 본다면 정보 은닉이 가능하다.

어떠한 한 함수 안에서 내가 공개하고 싶은 정보가 있고, 공개하기 싫은 정보가 있다고 치자.

타인이 내가 공개하기 싫은 정보에 마음대로 접근해서 값을 바꾸는 것을 방지하고자 이것들은 감추고, 원하는 정보만 return을 사용해서 밖에 내보일 수 있게 된다.

결론: 데이터 보존모듈화

0개의 댓글