function book(){
function get() {
return point;
};
var point = 123;
return get();
};
console.log(book());
1. function 키워드를 만나게 되고 book 오브젝트 생성
2. [[scope]]에 글로벌 오브젝트 설정
3. 변수 확인, 해당사항 없음
4. book() 으로 함수를 호출하면 엔진은 실행 콘텍스트를 생성하고, 실행 콘텍스트 안으로 이동합니다.
준비 단계 - 환경조성
5. 컴포넌트(LEC, VEC, TBC)를 생성하여 실행 콘텍스트에 첨부
6. 환경레코드(ER)를 생성하여 LEC에 첨부
- 함수 안의 함수, 변수를 환경레코드에 바인딩
7. 외부 렉시컬 환경 참조(OLER)를 생성하고 렉시컬 환경 컴포넌트 내 첨부
8. 글로벌 오브젝트의 [[scope]] 를 외부 렉시컬 환경 참조에 설정(참조)
실행 콘텍스트(EC): {
렉시컬 환경 컴포넌트(LEC) = {
환경레코드(ER) : {
get : function 오브젝트,
point: undefined;
},
외부 렉시컬 환경 참조(OLER) : {}
},
변수 환경 컴포넌트(VEC) : {},
this 바인딩 컴포넌트(TBC) : {}
}
9. function 키워드를 만나게 되고 get function 오브젝트 생성
10. [[Scope]]에 get 스코프를 설정한다.
11. point 변수에 123 값이 할당 된다.
12. get() 으로 함수를 호출하면 엔진은 실행 콘텍스트를 생성하고, 실행 콘텍스트 안으로 이동합니다.
실행 콘텍스트(EC): {
렉시컬 환경 컴포넌트(LEC) = {
환경레코드(ER) : {},
외부 렉시컬 환경 참조(OLER) : {
point : 123
}
},
변수 환경 컴포넌트(VEC) : {},
this 바인딩 컴포넌트(TBC) : {}
}
13. 환경 레코드에서 먼저 찾고 없으면 외부 렉시컬 환경 참조에서 point를 찾습니다.
실행단계
14. 함수 내 코드 실행하여 point 값을 return 합니다.
제대로 이해한게 맞는가요?..