자바스크립트
[Javascript] 클로저란?
취업 드가자잇
2024. 4. 10. 22:21
이 글에서는 기술면접 단골 질문중에 하나인 '클로저'에 대해 이해한바를 얘기해보고자 한다.
클로저
우선, 클로저의 정의는 함수가 당시 선언된 환경(렉시컬 환경)을 기억한다는 뜻이다.
이 말만 들으면 참 추상적이라 이해하기 힘들 수 있다.
예를 들어,
function outer() {
let outer = "I am outer";
function inner() {
console.log(outer);
}
return inner;
}
let innerFunction = outer(); // outer 함수를 호출, inner를 반환
innerFunction(); // "I am outer" 출력
이 예시와 같이 inner 함수는 outer 함수에 값에 접근할 수 있다. 그리고 그것이 가능한 이유는 inner함수가 자신만의 실행 컨텍스트와 자신의 부모의 실행 컨텍스트를 '기억'하고 있기 때문이다.
여기서 한발 더 나아가자면, 사실 우리가 정의하는 모든 함수는 '클로저'라고도 볼 수 있다. 왜냐하면 함수는 항상 어떤 환경에서 선언되며, 해당 환경에 대한 참조를 유지하기 때문이다.
그렇기에 진정한 의미의 클로저란 실제 외부 함수의 지역 변수를 참조해야만 만족한다. 왜냐하면 브라우저단에서 성능 최적화를 위해 실제 외부 함수의 지역변수를 참조하지 않는 내부 함수의 외부 렉시컬 환경에 대한 참조의 값을 undefined로 변경해놓기 때문이다.