내부 함수의 저장된 렉시컬 환경을 이용하여 외부에서 해당 함수의 지역 내부의 데이터를 참조하는 현상을 말한다. 함수 스코프에서 말했다시피 일반적으로 내부에서 외부 데이터에 접근하는 것은 가능하면서도, 외부에서 내부 데이터를 불러오는 것은 불가능하다. 그러나 클로저는 이를 완전히 대척하는 결과를 가져온다. 이유가 무엇일까?
function outer() {
let outerVariable = 'THIS IS OUTER';
const innerFunction = function () {
console.log(outerVariable);
}
return innerFunction;
}
const temp = outer();
temp(); // 'THIS IS OUTER';
자바스크립트의 함수는 선언시 생성된 렉시컬 환경 정보를 계속 기억하고 있다. 즉 return innerFunction
일 경우 innerFunction
계속 outerVariable
에 대한 참조를 기억하고 있기 때문에 외부에서 호출했을 때 해당 참조값을 불러오는 것이 가능한 것이다.
초기에는 private
과 같이 일종의 접근 제한을 막기 위한 용도로 사용했다. 자바스크립트는 private
와 같은 접근 제한자가 없기 때문에, 이와 비슷한 용도로 사용하고자 클로저를 통해 private
을 사용했다. 현재의 경우는 typescript
를 통해 충분히 접근 제한을 구현하기 때문에 이를 위해 사용하는 경우는 드물 거라 예상한다.
이보다 훨씬 많이 사용하는 사례가 존재하는데 바로 상태변경 이다. 함수 내부에 상태값을 만들고, 이를 참조하거나 변환하는 함수들을 반환하여, 내부에서 직접적으로 상태를 변경하는 것은 불가능하기에 무분별한 업데이트를 방지하면서도, 반환된 함수를 호출하여 최산상태를 유지하는 것은 가능하도록 할 수 있다.