안녕하세요. 이번 시간에는 자바스크립트 단골 면접 질문이자 핵심개념인 클로저에 대해 알아보겠습니다.
function makeCounter() {
let count = 0;
return function() {
return count++
}
}
let counter = makeCounter();
//0
console.log(counter())
//1
console.log(counter())
//2
console.log(counter())
우리가 여기서 봐야할 개념은 어떻게 함수를 실행시켰는데 그 안에 있는 렉시컬 환경이 그대로 남아서 그거를 계속 참조하고 있느냐는 것이다.
우리가 중요하게 알아야 할 개념은 모든 함수는 함수가 생성된 곳의 렉시컬 환경을 기억한다는 점입니다. 함수는 [[Environment]]라 불리는 숨김 프로퍼티를 갖는데, 여기에 함수가 만들어진 곳의 렉시컬 환경에 대한 참조가 저장됩니다.
따라서 counter.[[Environment]]엔 count = 0인 렉시컬 환경에 대한 참조가 저장됩니다. 함수가 자신이 태어난 곳을 기억할 수 있는 건 바로 이 [[Environment]] 프로퍼티 덕분이며, 딱 한 번 값이 세팅되고 영원히 변하지 않습니다.
counter()를 호출하면 각 호출마다 새로운 렉시컬 환경이 생성됩니다. 그리고 이 렉시컬 환경은 counter.[[Environment]]에 저장된 렉시컬 환경을 외부 렉시컬 환경으로서 참조합니다.
때문에 makeCounter가 실행되고 종료가 되었음에도 계속해서 그 환경을 참조하여 count 값을 유지시키는 것입니다.