코어 자바스크립트 (2. 실행 컨텍스트) (2)

문린이·2022년 10월 30일
0

2-2 VariableEnvironment

VariableEnvironment : 현재 컨텍스트 내의 식별자들에 대한 정보 + 외부 환경 정보.
선언 시점의 LexicalEnvironment의 스냅샷으로, 변경 사항은 반영되지 않음

LexicalEnvironment : 처음에는 VariableEnvironment와 같지만 변경 사항이 실시간으로 반영됨.

ThisBinding : this 식별자가 바라봐야 할 대상 객체.

실행 컨텍스트를 생성할 때 VariableEnvironment에 정보를 먼저 담은 다음, 이를 그대로 복사해서 LexicalEnvironment를 만들고, 이후에는 LexicalEnvironment를 주로 활용

VariableEnvironment와 LexicalEnvironment의 내부는 environmentRecord와 outer-EnvironmentReference로 구성

2-3 LexicalEnvironment

사전적인, 사전적 환경 이라는 설명으로 이해(현재 컨텍스트의 내부에는 a, b, c와 같은 식별자들이 있고 그 외부 정보는 D를 참조하도록 구성 -> 컨텍스트를 구성하는 환경 정보들을 사전에서 접하는 느낌)

environmentRecord와 호이스팅

environmentRecord에는 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장
-> 컨텍스트 내부 전체를 처음부터 끝까지 쭉 훑어나가며 순서대로 수집

호이스팅이해하기

function a(x) {
  console.log(x);
  var x;
  console.log(x);
  var x = 2;
  console.log(x);
}

a(1);

해당 코드가 호이스팅 되면 다음과 같다.

function a(x) {
  var x;
  var x;
  var x;
  x = 1;
  console.log(x); // 1
  console.log(x); // 1
  x = 2;
  console.log(x); // 2
}

a(1);

environmentRecord는 현재 실행될 컨텍스트의 대상 코드 내에 어떤 식별자들이 있는지에만 관심이 있고, 각 식별자에 어떤 값이 할당될 것인지는 관심X
-> 변수를 호이스팅할때 변수명만 끌어올리고 할당 과정은 원래 자리에 그대로 남겨둔다.

함수 선언문과 표현식

// 함수 선언문
function sum(a, b) {
  return a + b;
}

// 함수 표현식
var multiply = function (a, b) {
  return a * b;
};

함수 선언문은 전체를 호이스팅하고 함수 표현식은 변수 선언부만 호이스팅한다.

스코프, 스코프 체인, outerEnvironmentReference

스코프란 식별자에 대한 유효범위
스코프체인이란 식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해나가는 것
이를 가능케 하는 것이 outerEnvironmentReference

여러 스코프에서 동일한 식별자를 선언한 경우에는 무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능

변수 은닉화란? 함수 내부에서 선언한 변수는 전역 공간에서 선언한 동일한 이름의 변수에 접근할 수 없는 것

2-4 This

실행 컨텍스트의 thisBinding에는 this로 지정된 객체가 저장

실행 컨텍스트 활성화 당시에 this가 지정되지 않은 경우 this에는 전역 객체가 저장

profile
Software Developer

0개의 댓글