[Note_코어 자바스크립트] 2장 실행 컨텍스트
실행 컨텍스트 - 실행코드에 환경정보들을 모아놓은 객체
호이스팅 - 특정 실행 컨텍스트가 활성화 되는 시점에 선언된 변수를 위로? 끌어올린다
## 1. 실행 컨텍스트
- 콜스택
** 전역 컨텍스트가 제일 먼저 담긴다.
함수 내부의 코드들로 외부-> 내부순으로 쌓았다가 내부->외부순으로 순차적으로 실행한다.
스택의 꼭대기에 있는 순간이 실행되는 순간이다.
- 특정 실행컨텍스트가 활성화 될 때 자바스크립트 엔진은 해당 컨텍스트를 실행하는데 필요한 환경정보들을 실행컨텍스트 객체에 저장한다.
- Variable environment: 현재 컨텍스트 내의 식별자들에 대한 정보 + 외부 환경 정보, 정적 상태의 렉시컬 스냅샷
- Lexical environment: 처음엔 변수환경과 같지만 컨텍스트가 런타임에 계속 변경됨
- this바인딩: this가 누구인지?
## Variable Environment
- 변수환경: 렉시컬 환경의 최초 스냅샷
- 변수 환경에 먼저 정보를 담고 그다음에 lexical 환경을 구성한뒤 lexical을 이용하면서 계속 변경한다.
## Lexical Environment
- 정적 환경이라고 부르는 사람들이 있지만 렉시컬은 계속 변하기 때문에 정적이라는 말은 맞지 않다.
- environment record
- outer environment refference
- Environment Record: 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장되는 곳. 내부 선언된 식별자들을 저장함. 매개변수 이름, 함수선언, 변수명이 담긴다.
**전역 컨텍스트인 window는 자바스크립트 내장객체가 아니고 host객체이다.
**호이스팅: 끌어올리다. 선언부를 위로 끌어올려서 실행하는 것과 같은 효과다.
- 선언 이전에 호출을 할 수 있는 이유와 밀접한 연관이 되어있다.
- 실행 컨텍스트가 생성되는 시점에 선언부를 위로 끌어 올리는 것에 관한 개념이다.
** 식별자 = 익명함수 표현식:함수 표현식 <---> 이름 있는 함수표현식: 함수 선언
** 함수 선언 방식으로 작성하면 실행할 때 식별자에 함수 표현식을 할당하는 형태로 결국 실행하게 된다.
**** 기명 함수표현식의 형태로 함수를 작성하면 호출 이전에 작성을 해야 실행이 된다 *****
**** var를 쓰게 되면 같은 실행 컨텍스트 내에서 선언을 여러번 할 수 있기 때문에 빈번한 버그 요인이 된다 ***
*** var로 선언을 하게되었더라도 함수 표현식의 경우는 할당부의 위치가 호이스팅이 발생하지 않고 남아있기 때문에 오류 위험이 적다 ****
## 스코프와 스코프 체인
outer environment reference: 함수 선언 당시 그 선언 영역(함수외부)의 lexical env
- es5 이전에는 오직 함수로만 스코프 체인이 형성됐었다. outer environment reference 때문이다.
- outer environment reference는 함수 선언 시점의 그 함수의 첫번째 외부에 있는 함수의 lexical environment이다.
가장 바깥의 outer environment reference는 그 밖의 것이 없으므러 outer가 없을 것이다.
- 여러 스코프에서 동일한 식별자를 선언한경우 스코프체인을 따라가며 만난 가장 첫번째의 식별자만 인식한다.
**전역컨텍스트에서 this는 바깥이 outer가 없기 때문에 그냥 나 자신의 lexical으로 간주한다.
****실행컨텍스트를 판단할때는 호이스팅과 스코프를 종합적으로 고려하여 판단해야한다.
*** this는 내가 선언될 시점의 lexical이다.
변수 은닉화: 스코프 체인 탐색 과정을 이용하여 중간에 체인에 2번 이상 선언하여 바깥의 변수 접근을 막는 것
전역변수, 지역변수
*** 전역 공간에 여러개 선언하지 말고 전체 함수 하나로 감싼 다음에 선언해라 **
실행 컨텍스트 활성화 시 this가 지정되지 않으면 전역객체가 this이다.
그 외에는 함수 호출 방식에 따라서 다르다.