본문 바로가기

programming/Javascript

[Javascript] 클로저란? private 변수, 메소드의 관점

여러가지 정의들 중에, 개인적으로 좀 더 직관적으로 받아들여 졌던 정의는, 다음과 같다

클로저란, 생성한 시점의 스코프체인을 기억하여, 비공개 변수를 가질수 있는 환경에 있는 함수이다.

 

이 외, 다른 정의들

  • MDN) 클로저는 독립적인 변수를 가리키는 함수이다. 또는 클로저 안에 정의된 함수는 만들어진 환경을 기억한다.
  • 함수와 렉시컬 환경의 조합
  • 함수가 생성될 당시의 외부변수를 기억하여 생성 이후에도 계속 참조가 가능한 것
  • 생성한 시점의 스코프체인을 계속 들고있는 함수

 

 

 

일단 실무에서는 private 변수를 사용하기 위한 것으로 많이 쓰인다.

 

 

선행지식 스코프체인

 

스코프는 일단 범위라는 뜻인데, 간단하게 브라켓{}, 블록 안 저장소라고 생각하자.

 

블록별로 (if문, 함수선언문, while...등) 자기만의 스코프를 갖는것이다.

 

근데 이게 전역 안에 외부함수 안에 내부함수 안에 내부함수 .... 이런식으로 함수안의 함수를 알낳기를 계속하면,

 

내부의 브라켓(함수)부터 상위의 스코프를 참조할 수 있다.

 

체인처럼 이어서 참조할 수 있다는 것을 스코프 체인이라 한다.

 

다시 클로저로 돌아와서,

 

클로저는 이 스코프 체인의 특성을 이용하면서 블록안의 변수를 블록 밖에서도 사용할 수 있게한다.

하지만 매우 제한적인 조건으로

 

여기서 제한적인 조건이 나오는데, 내부의 변수나 메소드들을 지정하고 외부에서 끌어쓸때 함부로 내부의 내용들을 변경할 수 없게 만든다.

그런맥락에서 이름이 클로저가 아닐까 싶다.

 

function makeCounter() {
    let num = 0;

    return function() {
        return num++
    }
}

let counting = makeCounter();

console.log(counting())  // 0
console.log(counting())  // 1
console.log(counting())  // 2
console.log(counting.num)  // undefined