🌟 내부 함수가 외부 함수의 컨텍스트에 접근할 수 있는 것을 가리킨다
📌 클로저를 이해하기 위해서는 자바스크립트가 어떻게 변수의 유효범위를 지정하는지 (Lexical Scoping) 을 먼저 이해해야 한다.
function hello(name) {
let _name = name; // 변수명 앞에 underscore(_)를 포함하면 private val임을 의미
return function () {
// 클로저 함수
console.log('Hello, ' + _name);
};
}
let hello1 = hello('혜린');
hello1(); // output = Hello, 혜린
클로저는 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical Scope) 를 기억하여 자신이 선언됐을 때의 환경밖에서 호출되어도 그 환경(스코프)에 접근할 수 있다.
- 일반 함수는 선언할 때 마다 내부 함수의 변수가 초기화된다.
- 클로저 를 사용할 때는 내부의 클로저가 외부 함수의 변수 값을 기억하고 있다.
1️⃣ 정보를 은닉하기 위해. 특정 함수에게만 상태 변경 허용하기 위해 사용한다.
2️⃣ 캡슐화 - 객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작하는 메서드를 하나로 묶는 것
3️⃣ 전역 변수의 사용 억제 (자신이 생성되었을 때의 lexical 환경을 기억하기 때문)
4️⃣ 현재 상태를 기억하고 변경된 최신 상태를 유지하기 위해
일반 함수의 경우 사용하면 소멸되지만, 클로저를 사용하면 소멸되어야 할 객체들이 메모리상에 남아있기 때문에 클로저를 남발하기보다는 필요한 곳에만 사용해야 한다.