회고
이번 장은 설명이 잘 되어 있어서 이해하기 쉬웠고, 식별자, 매개 변수 등 1장을 제대로 공부해둬서 다행이란 생각이 든다.
실행 컨텍스트
- 실행할 코드에 제공할 환경 정보들을 모아놓은 객체
- 전역 컨텍스트 , eval , 함수 실행에 의한 컨텍스트 등이 있다.
- 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드들을 실행하는 식으로 전체 코드의 환경과 순서를 보장한다.
- 실행 컨텍스트를 구성하는 방법 : 함수를 실행하는 것
- 실핸 컨텍스트가 콜 스택의 맨 위에 쌓이는 순간이 곧 현재 실행할 코드에 관여하게 되는 시점
실행 컨텍스트에 담기는(실행 컨텍스트가 수집하는) 정보들
- VariableEnvironment : 현재 컨텍스트 내의 식별자들에 대한 정보 , 외부 환경 정보, 선언 시점의 LexicalEnvironment 의 스냅샷으로, 변경 사항은 반영 되지 않는다.
- LexicalEnvironment : 처음에는 VariableEnvironment 와 같지만 변경 사항이 실시간으로 반영된다.
- ThisBinding : This 식별자가 바라봐야 할 대상 객체
1) VariableEnvironment
- 실행 컨텍스트를 생성할 때 VariableEnvironment 에 정보를 먼저 담은 다음, 이를 그대로 복사해서 LexicalEnvironment 를 만들고 이후에는 LexicalEnvironment 를 주로 활용하게 된다.
2) LexicalEnvironment
- "현재 컨텍스트 내부에는 a,b,c와 같은 식별자들이 있고, 그 외부 정보는 D 를 참조하도록 구성돼있다." 라는, 컨텍스트를 구성하는 환경 정보들을 사전에서 접하는 느낌으로 모아놓은 것이다.
environmentRecord 와 호이스팅
- 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다.
- 매개변수 식별자(이름), 함수 자체, var 로 선언된 변수의 식별자 등
- 컨텍스트 내부 전체를 처음부터 끝까지 쭉 훑어나가며 순서대로 수집한다.
참고
- 전역 실행 컨텍스트는 호스트 객체로 분류된다.
- 의미 : 자바스크립트 구동 환경이 별도로 제공하는 객체, 즉, 전역 객체를 활용한다.
호이스팅
- '자바스크립트 엔진은 이미 해당 환경에 속한 코드의 변수명들을 모두 알고 있다.'
- 변수 정보를 수집하는 과정을 더욱 이해하기 쉬운 방법으로 대체한 가상의 개념
호이스팅 규칙
- 변수를 호이스팅 할 때 : 변수명만 끌어올리고, 할당 과정은 원래 자리에 그대로 남겨둔다.
- 함수 선언 : 함수 전체를 끌어 올린다.
- 호이스팅이 끝난 상태에서의 함수 선언문은 함수명으로 선언한 변수에 함수를 할당한 것처럼 여길 수 있다.
함수 선언문과 함수 표현식
- 함수 선언문은 fucntion 정의부만 존재하고, 별도의 할당 명령이 없는 것, 반드시 함수명이 정의 되어 있어야 한다.
- 함수 표현식은 정의한 function 을 별도의 변수에 할당하는 것, 함수명이 없어도 된다.
![](https://velog.velcdn.com/images%2Fannmj%2Fpost%2F295ad131-6294-4971-bdac-799b60ba659d%2Fimage.png)
- 기명 함수 표현식은 함수 내부에서 재귀함수를 호출하는 용도로 쓸 수 있다.
- 원활한 협업을 위해서는 전역 공간에 함수를 선언하는 경우는 없어야 한다.
- 모든 함수를 되도록이면 함수 표현식으로 정의하자.
중요한 차이점
- 함수 선언문은 전체를 호이스팅 한다.
- 함수 표현식은 변수 선언부만 호이스팅 한다.
스코프, 스코프 체인, outerEnvironmentReference
스코프
식별자에 대한 유효범위를 의미한다.
스코프 체인
식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해나가는 것을 의미한다.
outerEnvironmentReference
현재 호출된 함수가 선언될 당시 의 LexicalEnvironment 를 참조한다.
연결 리스트형태를 띄며, 점점 범위를 확장해나가면서 탐색을 한다.
여러 스코프에서 동일한 식별자를 선언한 경우에는 무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능하게 된다. ( 가장 먼저 : 가장 가까운 안쪽 또는 바깥쪽 스코프 )
변수 은닉화
스코프 체인 상에 있는 변수라고 해서, 무조건 접근 가능한 것은 아니다.(은닉)
inner 함수 내부에서 a 변수를 선언하면, 전역 공간에 선언한 a 에는 접근할 수 없다.
이를, 변수 은닉화 라고 한다.
전역 변수와 지역 변수
- 전역 공간에서 선언한 변수는 전역 변수
지역 공간 함수 내부에서 선언한 변수는 무조건 지역 변수
- 코드의 안정성을 위해 가급적 전역변수 사용을 최소화하고자 노력하는 것이 좋다.