(복습. Closure함수: 자신이 선언 되었을 때 렉시컬 환경(렉시컬 스코프)을 기억하는 함수)
(내생각)실행컨텍스트(환경), 스코프가 같은 의미로 쓰일수 있다. (내생각)실행컨텍스트: 코드 실행에 필요한 환경(조건이나 상태)을 모아둔 객체(즉 스코프역시 코드 실행에 필요한 조건이나 상태를 모아둔 영역이므로 스코프가 실행컨텍스트와 같은 의미일 수 있는것이다)
요약: 실행 컨텍스트이란? 코드를 실행하는데 필요한 환경을 제공하는 객체. 여기서 환경이란 코드 실행에 영향을 주는 조건이나 상태를 의미함. 식별자 결정을 더욱 효율적으로 하기 위한 수단으로써 필요한 정보를 한곳에 모아 제공하는 객체.
스코프 체인이란?: 스코프들의 연결리스트임!! 식별자를 결정할 때 활용하는 스코프들의 연결리스트 (내 생각에는 rough하게 scope=실행 컨텍스트=환경 이다)
바인딩(Binding)이란 식별자와 값(인스턴스)을 연결하는 것이다. 스코프체인이 전역스코프를 가리키는 전역객체를 바인딩하고 함수 outerFunc의 스코프를 가리키는 함수 outerFunc의 활성 객체를 반인딩하고... 이렇게 스코프와 객체를 바인딩한다는 의미는 각각의 스코프가 식별자의 역할을 하고 각각의 객체가 값의 역할을 한다는 것이다.
1. 실행컨텍스트의 환경 레코드 관점에서 호이스팅 이해하기:
로딩시점에 Js engine이 먼저 코드를 스켄하면서 변수정보를 실행컨텍스트의 환경 레코드에 기록함. Environment record란 식별자와 식별자에 연결된 값을 기록하는 객체이다. 환경레코드에 변수가 어떻게 기록되는지만 잘 알아도 호이스팅을 바로 이해할 수 있다.
var 키워드로 변수를 선언한 경우 선언과 초기화가 동시에 이루어짐(우선은 undefined로 초기화됨). 하지만 let, const로 변수를 선언한 경우는 선언만 환경 레코드에 기록되고(이때 초기화는 이루어지지 않아 값을 위한 메모리 공간조차 마련되어 있지 않은 상태임) 초기화는 선언문에 가서 이루어짐.