렉시컬 스코프를 기억하고 있는 함수.
Lexical Scope에 대해 이해했다면 클로저라는 개념 자체는 공짜로 따라오는 개념이다. 너무 당연한 이야기이기 때문이다.
그렇다면 이러한 개념을 어떻게 응용할 것인가?
CallStack에서 해당 함수가 종료되는 순간 불필요한 값들은 GC에 의해 삭제된다.
그러나 삭제되지 않는 값들이 있다.
LexicalScope 중 클로저 함수가 참조하고 있는 변수값이 그것이다.
const user = (input) => {
let name = input;
return {
getUserName : () => {
return name;
},
setUserName : (newName) => {
name = newName;
}
}
}
위의 사례에서 name이라는 변수는 getUserName, setUserName이라는 클로저함수의 Lexical Scope에서 참조되고있는 변수이다. 따라서 해당 값은 GC에 의해 수집 대상에서 제외된다.
console.log(q.name) //undefined
물론, scope의 특성상 필드에 직접 접근은 불가능하다. 하지만 return해준 getUserName과 setUserName 메서드를 통해 name에 접근하고 수정할 수 있다.