* counter1과 counter2 객체의 increase 메소드를 호출하면 2라인에서 볼 수 있는 createCounterClosure 함수 내부의
count 변수에 모두 접근한다. 하지만 cunter1과 counter2의 getCount를 호출한 결과를 보면
counter1의 메소드들이 가리키는 count와 counter2의 메소드들이 가리키는 count가 다른 값을 가지고 있는 것을 알
수 있다.
counter1과 counter2의 메소드들이 다른 count에 접근하는 것은 다른 렉시컬 환경의 환경 레코드에서 count에 접근하는 것이다. 이러한 현상이 가능한 이유는 바로 클로저 때문이다.
increate와 getCount 함수가 정의될 때의 렉시컬 환경은 createCounterClosure 실행 컨텍스트의 렉시컬 환경이다.
그래서 increase 함수와 getCount함수는 createCounterClosure 실행 컨텍스트의 렉시컬 환경을 기억하고 있는 클로저가 된다.
대체로 실행 컨텍스트가 컨텍스트 스택에서 제거되면 해당 환경은 사라지기 마련인데 위 예제 처럼 클로저가 만들어지면 해당환경은 사라지지 않는다. 왜냐하면 해당 참조가 존재하기 때문이다.
(예제는 counter1 과 counter2가 전역 변수에 할당되어 참조가 존재한다.)
[NOTE]
클로저란 함수가 정의될 때의 렉시컬 환경을 기억하는 함수를 말한다.
- 렉시컬(Lexical) 스코프 : 코드를 작성하는 시점에 스코프가 결정되어 진다고 해서 정적 스코프라고도 부른다.
- 다이나믹(Dynamic) 스코프
* 자스크립트는 대표적인 렉시컬 스코프이다.
'IT 개발 > JavaScript' 카테고리의 다른 글
jQuery validation : 입력 데이터 유효성 검사 플러그인 (0) | 2021.10.19 |
---|---|
객체 속성 기술자 이해하기 (0) | 2021.09.12 |
스코프 이해하기 (0) | 2021.09.12 |
함수 호이스팅 이해하기 (0) | 2021.09.12 |
ES6의 향상된 객체 문법 알아보기 - 단축 속성명, 속성 계산명, 비구조화 할당 (0) | 2021.09.04 |