객체의 속성중 하나인 범위(Scope)를 벗어난 다른 값이나 참조가 저장된 주소를 캡쳐하여 연결하는 포인터이다
예시를 통하여 의미를 확인해 보자
다음과 같이 구문을 작성했을때 본래 a는 선언된 대리자의 블록 범위 바깥에 있는 객체이기 때문에 사용할 수 없어야 하지만, 정상적으로 구문이 실행되고있는 것을 확인할 수 있다
어떻게 이러한 일이 가능한지, 디스어셈블리를 통하여 확인해보자
빨간색 박스 안은 int a의 주소 값이며, a로 찾아가니 0x0a(10진수 10)가 저장된 것을 확인할 수 있다
다음은 대리자 action이다. action으로 찾아가니 어떤 주소값이 저장되어있음을 확인할 수 있다
이 주소값을 따라가게 되면
처음 보았던 int a의 주소값인 0x000001DC9D8CAD88 근처의 주소가 나오는데, 이 주소를 따라가면
int a의 주소가 나오는 것을 확인할 수 있다. 이처럼, 캡쳐한다는 의미는 참조(주소값)를 가져온다는 의미이다
그렇다면, 클로저는 왜 동작할 수 있는걸까?
함수의 범위로서, 함수의 스코프라고도 표현한다
함수의 범위는 함수의 코드 블록 뿐만 아니라 외부의 코드 블록까지이다. 그렇기 때문에 무명 함수에서 외부의 변수를 캡쳐해 사용할 수 있는 것이다. 외부의 변수를 가져올 경우, Local Variable도 Parameter도 아닌 함수에 사용되는 변수를 의미하는 뜻으로 Free Variable이라 표현한다
함수 내부의 지역 변수를 가지고 있는 객체를 뜻하는 Environment Record와 정의된 함수 외부의 스코프인 Lexical Environment에 대한 참조를 의미한다
함수의 스코프는 렉시컬 스코프이기 때문에 클로저를 사용할 수 있는 것이다