외부 변수를 기억하고 이 외부 변수에 접근할 수 있는 함수
[[Environment]]
프로퍼티를 통해 클로저로 동작내부 숨김 연관 객체(internal hidden associated object)로써 다음 두 부분으로 구성
변수를 가져오거나 변경하는 것
은 환경 레코드의 프로퍼티를 가져오거나 변경함
을 의미스크립트 실행시 스크립터 전체와 관련된 전역 렉시컬 환경 생성
<uninitialized>
값을 가지며 이 때는 참조될 수 없음null
함수 호출 시 함수의 렉시컬 환경 생성
코드에서 변수에 접근할 땐, 먼저 내부 렉시컬 환경 -> 외부 렉시컬 환경 -> ... -> 전역 렉시컬 환경
[[Environment]]
모든 함수가 갖는 숨김 프로퍼티이며, 여기에 함수가 만들어진 곳의 lexical environment에 대한 참조가 저장되며 영원히 변하지 않음
[[Environment]]
프로퍼티를 통해 함수는 계속해서 같은 외부 렉시컬 환경에 접근하여 같은 외부 변수에 접근할 수 있다. 즉, 클로저 함수가 구현된 것.
function makeCounter() {
let count = 0;
return function() {
return count++;
};
}
let counter = makeCounter();
alert( counter() ); // 0
alert( counter() ); // 1
alert( counter() ); // 2
중첩함수로 정의된 counter
는 실행할 때마다 외부 변수인 count
에 접근하여 그 값을 +1 한다. 이 때 counter()
로 호출할 때마다 새로운 렉시컬 환경이 생성되는데 [[Environment]]
프로퍼티에 저장되어 있는 외부 렉시컬환경 참조를 기억하여 계속해서 같은 외부 렉시컬 환경에 접근할 수 있고, 그를 통해 count
값이 계속해서 증가할 수 있는 것.