
함수가 선언될 때의 스코프(변수에 접근할 수 있는 범위)를 기억하여, 함수가 생성된 이후에도 그 스코프에 접근할 수 있는 기능입니다.
클로저는 함수가 일급 객체라는 특성과 렉시컬 스코프(함수가 선언되었을 때의 환경)의 조합으로 만들어집니다.
function outerFunction(outerVariable) {
return function innerFunction(innerVariable) {
console.log('Outer Variable: ' + outerVariable);
console.log('Inner Variable: ' + innerVariable);
};
}
const newFunction = outerFunction('outside');
newFunction('inside');
예시 코드를 보면 innerFunction은 outerFunction 내부에 정의되어 있고, newFunction이 선언될 때 outerVariable은 'outside'로 정의됩니다.
이후 newFunction('inside');를 통해 innerFunction을 실행할 때, outerFunction이 선언될 때의 'outside'인 outerVariable에 접근하여 다음과 같은 결과를 출력하게 됩니다.
Outer Variable: outside
Inner Variable: inside
실제로 newFunction을 실행할 때 outerVariable에 대한 정보는 제공하지 않았지만, newFunction을 선언할 때 정의한 outerVariable이 사라지지 않고 유지되어, 이후 innerFunction이 실행될 때 기억된 스코프에 접근하여 사용할 수 있게 됩니다.
데이터 은닉
외부에서 접근할 수 없는 비공개 변수와 함수를 만들 수 있습니다.
이를 통해 데이터를 은닉하여 외부 접근을 막고, 데이터 무결성을 유지할 수 있습니다.
비동기 작업
클로저는 비동기 작업에서 이전의 실행 컨텍스트를 유지해야 할 때 유용합니다.
콜백 함수가 비동기적으로 실행될 때 클로저를 사용하면 함수 실행 시점의 변수를 참조할 수 있습니다.
모듈 패턴을 구현
클로저를 활용하여 필요한 함수와 데이터만 외부로 노출함으로써, 특정 기능을 캡슐화하고 코드의 응집력을 높이고 유지보수성을 향상시키는 모듈 패턴을 쉽게 구현할 수 있습니다.