JavaScript
클로저, 넌 누구냐?
AgileJung
2022. 4. 27. 18:14
728x90
반응형
클로저란?
클로저(closure)는 중첩 함수에서 내부 함수가 소멸된 외부 함수의 맥락(context)에 접근할 수 있는 것을 가리킨다.
내부 함수가 외부 함수의 변수에 접근할 수 있는 이유
외부 함수가 종료되면 외부함수가 가지고 있던 변수도 같이 소멸된다. 그렇기 때문에 내부 함수 안에서 함수 밖의 변수를 사용할 수 없다고 생각할 수 있다. 하지만 렉시컬 환경에 의해서 내부 함수에서 외부 함수의 변수에 접근할 수 있다.
렉시컬 환경이란?
호출된 함수가 어디서 사용되었고, 주변에 어떠한 함수가 있는지 기록한 환경.
-> 포함하는 식별자, 식별자에 바인딩된 값, 상위 렉시컬 환경에 대한 참조
ex) 민수는 성북구에 2년 동안 살았지만, 지금은 이사를 갔다.
=> 민수는 현재 성북구에 없지만 성북구에 살았던 기록은 남아있다.
렉시컬 환경은 함수가 실행되는 과정에서 생성된다.
함수가 실행되는 과정
1. 함수가 호출된다.
2. 실행 컨텍스트를 생성하며, 실행 컨텍스트 스택에 담기게 된다.
3. 함수가 호출된 위치와 생성한 변수 등, 주변의 환경정보에 대한 렉시컬 환경을 생성한다.
함수의 실행 컨텍스트는 실행이 끝나면 실행 컨텍스트 스택에서 소멸하게 된다.
내부 함수가 외부 함수의 변수를 사용하는 과정
다음 코드는 외부 함수는 변수 x를 가지고 있고, 내부함수는 변수 x를 콘솔 창에 출력한다. 외부함수는 종료 전에 내부함수를 변수 va에게 반환한다.
Q. 출력되는 x의 값은 무엇일까?
A. 정답은 10이 된다.
다음은 위의 코드를 실행했을 때의 과정이다.
1. 외부 함수 종료되면서, 외부함수 실행 컨텍스트가 실행 컨텍스트 스택에서 소멸되고, 변수 va에게 내부 함수를 반환한다.
2. 외부함수 렉시컬 환경도 소멸되어야 하지만, 변수 va가 내부함수를 참조하면서 사라지지 않는다.
3. 내부 함수의 내부슬롯이 외부함수 렉시컬 환경을 참조하고 있었기 때문에 내부함수 x의 값은 10이 된다.
위의 내용처럼, 외부 함수가 종료됐음에도 내부 함수가 외부 함수의 변수에 접근(참조)할 수 있음을 알 수 있다.
외부 함수는 소멸됐지만 내부 슬롯에 저장된 상위 스코프를 참조하여 상위 스코프의 식별자를 참조하는 것
이러한 메커니즘을 클로저 라고 부른다.
클로저를 사용하는 이유
규모가 큰 프로젝트를 진행하면, 프로젝트의 코드가 많은 사람들의 손을 탈 수 있다.
많은 사람들이 코드를 수정하고 다루다 보면 오류가 날 확률이 높아질 수 있다.
그렇기 때문에 클로저를 활용해서 특정한 조건을 통해서만 접근할 수 있는 변수를 만든다(클로저).
728x90
반응형