클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경과의 조합이다.
A closuer is the combination of a function and the lexical environment within which that function was declared
외부함수 안에 내부함수가 선언되고 호출되었을 때 내부함수는 자신을 포함하고 있는 외부함수의 변수 x에 접근할 수 있다
function outerFunc() {
const x = 10;
function innerFunc() {
console.log(x);
}
innerFunc;
}
스코프는 함수를 호출할 떄가 아니라 함수를 어디에 선언하였는지에 따라 결정 (렉시컬 스코핑)
내부함수 innerFunc 호출되면 자신의 실행 컨텍스트가 실행 컨텍스트 스택에 쌓이고 변수 객체와 스코프체인 그리고 this에 바인딩할 객체가 결정된다. 스코프 체인은 전역 스코프를 가리키는 전역 객체와 함수 outerFunc의 스코프를 가리키는 함수 outerFunc의 활성 객체 그리고 함수 자신의 스코프를 가리키는 활성 객체를 순차적으로 바인딩
다시 말해서, 클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경인 스코프를 기억하여 자신이 선언됐을 떄의 환경 밖에서 호출되어도 그 환경에 접근할 수 있는 함수
쉽게 말해서, 클로저는 자신이 생성될 떄의 환경을 기억하는 함수