1. 렉시컬 스코프
- 자바스크립트 엔진은 함수를 어디서 호출했는지가 아니라 함수를 어디에 정의했는지에 따라 상위 스코프를 결정한다.(정적 스코프(렉시컬))
- 스코프의 실체는 Lexical enviroment 이다. 이 연결이 스코프 체인이다.
2. 함수 객체의 내부슬롯 [[Environment]]
- 함수는 함수 정의가 평가되어 함수 객체를 생성할 때 자신의 내부슬롯 [[Environment]]에 자신이 정의된 환경, 즉 상위 스코프의 참조를 저장한다.
- 내부슬롯 [[Environment]]에 저장된 현재 실행 중인 실행 컨텍스트의 렉시컬 환경의 참조가 바로 상위 스코프다.
3. 클로저와 렉시컬 환경
- 외부 함수보다 중첩 함수가 더 오래 유지되는 경우 중첩 함수는 이미 생명 주기가 종료한 외부함수의 변수를 참조할 수 있다. 이러한 중첩 한수를 클로저 라고 부른다.
- 클로저의 조건
- 상위 스코프의 어떤 식별자도 참조하지 않는 함수는 클로저가 아니다.
- 생명주기가 외부함수보다 짧은 함수는 클로저가 아니다.
- 외부함수는 실행 컨텍스트 스택에서는 pop 되지만 외부함수 렉시컬 환경은 남아 있고 클로저는 이 렉시컬 환경을 참조하고 있기 때문에 자유변수를 사용할 수 있다.
4. 클로저의 활용
- 클로저는 상태를 안전하게 변경하고 유지하기 위해 사용한다.
- 클로저는 상태를 안전하게 은닉하고 특정함수에게만 상태 변경을 허용하기 위해 사용한다.
- 함수형 프로그래밍에서 클로저를 활용할 때 같은함수를 각각 독립적으로 호출할 경우 자유변수를 공유하지 않는 함수 자신만의 독립된 렉시컬 환경을 갖는다. 따라서 자유변수를 공유해야 하면 렉시컬 환경을 공유하는 클로저를 만들어야 한다.
5. 캡슐화와 정보은닉
- 프로퍼티와 메서드를 하나로 묶는 것을 캡슐화라 한다.
- 캡슐화는 객체의 특정 프로퍼티나 메서드를 감출 목적으로 사용하기도 하는데이를 정보 은닉이라 한다.
- 객체의 상대가 병경되는 것을 방지해 정보를 보호하고 객체 간의 상호 의존성, 즉 결합도를 낮추는 효과가 있다.
- 자바스크립트는 정보 은닉을 완전하게 지원하지 않지만 2021 1월 새로운 표준사양이 제안되어 있고 조만간 배워야 할 것 같다.
6. 자주 발생하는 실수
- 블록레벨 스코프와 함수레벨 스코프의 차이를 주의하자 (24-20)
- for문이 실행 컨텍스트에서 어떻게 동작하는지 알아두기(24-11)