Conversation
VariableEnvironment
LexicalEnvironment
ThisBinding
참조 에러 let, const로 정의된 변수는 var 키워드 변수와는 달리 평가 단계에서 undefined로 초기화되지 않음. 로 표현되어 TDZ 상태에 놓이게 됨
전역 평가 단계를 진행하여 전역 실행 컨텍스트를 생성하고 전역 렉시컬 환경의 선언적 환경 레코드에 식별자 x 등록 실행 단계에서 x = 1로 초기화하며 값 바인딩 if 블록에 진입해 새로운 실행 컨텍스트를 만들지 않고 블록 레벨 스코프를 생성. 이때 생성된 렉시컬 환경의 OuterLexicalEnvironmentReference는 if 문이 실행되기 이전 전역 렉시컬 환경을 가리킴 블록의 코드 수행이 종료되면 다시 기ㅣ존의 전역 렉시컬 환경으로 교체하고 console.log(x) 또한 검색 과정을 통해 출력된 후 전역 실행 컨텍스트가 pop 되어 종료 |
|
Q1.
Q2.
Q3. 이유:
따라서 ReferenceError가 발생한다. Q4. 이유:
|
Q1. OX 퀴즈
Q2. 실행 컨텍스트가 소스코드를 실행하기 위해 내부적으로 관리하는 세 가지 주요 구성 요소를 쓰고, 각각의 역할을 간략히 설명하시오.실행 컨텍스트가 내부적으로 관리하는 주요 구성 요소는
실행 컨텍스트에 의해 위 3가지 요소가 관리되며 소스코드를 실행하기 위한 준비가 이루어지는 것이다!! Q3. 코드의 출력값을 쓰고, 그 이유를 서술하시오.const a;
function outer() {
const b;
function inner() {
console.log(a, b, c);
}
b = 2;
inner();
}
const c;
a = 1;
outer();
c = 3;출력 결과: 1, 2, ReferenceError 전역 코드의 평가 단계에서 전역 렉시컬 환경이 생성되고, 변수 a, outer, c가 환경 레코드에 등록된다. 이때 a와 c는 초기화되지 않은 상태(즉, TDZ에 있음) 이고, outer는 함수 선언문이므로 즉시 초기화되어 참조 가능하다. 전역 코드 실행 단계에서 a = 1이 실행되어 a가 초기화되고, outer()가 호출된다. outer() 호출 시 새로운 실행 컨텍스트가 생성되고, 지역 변수 b와 내부 함수 inner가 outer 렉시컬 환경의 환경 레코드에 등록된다. 이후 b = 2가 실행되어 값이 할당된다. 그 다음 inner()가 호출된다. inner() 실행 시 console.log(a, b, c)를 평가하기 위해 스코프 체인을 따라 식별자를 탐색한다.
Q4. 다음 코드 실행 시, if 블록 내부와 외부의 스코프 구조가 어떻게 달라지는지 실행 컨텍스트 관점에서 서술하시오.코드가 처음 실행되면 그 다음 이 블록 스코프는 전역 스코프를 바깥 환경으로(Outer Environment Reference) 참조하는 별도의 렉시컬 환경이다. 블록 내부에서 따라서 블록 내부의 이후 가장 가까운 블록 스코프에 이때 전역 스코프의
이제 남은 것은 전역 스코프의 실행 컨텍스트뿐이며, 전역 변수 마지막 줄의 |
jstar000
left a comment
There was a problem hiding this comment.
Q1.
- (O)
- (O)
Q2.
- LexicalEnvironment
식별자와 식별자에 바인딩된 값을 관리하는 저장소
Environment Record와 Outer Lexical Environment Reference로 구성됨
스코프와 스코프 체인을 구현 - VariableEnvironment
초기에는 LexicalEnvironment와 동일한 Lexical Environment를 참조하다가, 필요시 분리됨 - ThisBinding
this 키워드가 참조할 객체를 저장, 함수 호출 방식에 따라 동적으로 결정됨
Q3.
출력값: ReferenceError
전역 객체 생성 후 전역 코드 평가에 의해 전역 실행 컨텍스트와 전역 Lexical Environment가 생성됨. cosnt 키워드로 선언된 변수 a와 c가 Declarative Environment Record에 등록되고, outer 함수는 Object Environment Record에 등록됨. 전역 코드가 실행되면 uninitialized 상태였던 a에 1이 할당되고, outer 함수가 실행되며 코드 제어권이 전역 코드에서 outer 함수 내부로 이동함.
outer 함수 코드 평가 과정에서 변수 b가 uninitialized 상태로, 함수 inner가 함수 객체가 초기화된 상태로 함수 Environment Record에 등록되고, 함수 코드 실행 과정에서 b는 2를 할당받은 후 inner 함수가 실행됨.
코드 제어권이 inner 함수 내부로 이동하고 inner 함수의 실행 컨텍스트와 Lexical Environment가 생성된 후 inner 함수 코드가 실행되며 식별자 a, b, c 검색을 시작함.
현재 Lexical Environment에서 식별자 a, b, c를 검색할 수 없으므로 inner 함수의 Lexical Environment의 OuterLexicalEnvironmentReference로 상위 스코프인 outer의 Lexical Environment로 이동해 b를 찾음. 같은 방식으로 outer의 상위 스코프인 전역 스코프로 이동해 a와 c를 찾는데, a는 이미 값의 할당이 완료된 상태이지만 c는 선언은 되었지만 할당은 되지 않아 uninitialized 상태인 TDZ에 빠져있으므로 ReferenceError가 발생함
Q4.
if 블록은 새로운 실행 컨텍스트를 생성하지는 않으므로 전역 실행 컨텍스트가 계속 유지됨.
if 블록 진입 시 새로운 블록 Lexical Environment가 새로 생성되며, 블록 내부의 let, const 변수는 이 블록 렉시컬 환경에 등록됨. 이때 if 블럭에 의해 새롭게 생성된 Lexical Environment의 OuterLexicalEnvironmentReference는 if문 실행 이전의 전역 Lexical Environment를 가리킴
Q1
Q2
Q3출력값: ReferenceError
Q4
|
A1.
A2.
A3.[실행 결과] ReferenceError A4.let x = 1;
if (true) {
let x = 10;
const y = 20;
console.log(x + y);
}
console.log(x);[실행 결과]
|
1. OX 퀴즈
소스코드의 평가 과정에서는 변수와 함수의 선언문만 먼저 실행되어 식별자를 스코프(렉시컬 환경의 환경 레코드)에 등록하고, 소스코드의 실행 과정에서는 등록된 식별자에 값을 할당하거나 참조한다. (O/X)
실행 컨텍스트가 생성될 때마다 새로운 렉시컬 환경(Lexical Environment) 이 함께 생성되며, 렉시컬 환경이 스코프 체인(Scope Chain) 을 구성하는 기반이 된다. (O/X)
2. 다음 내용을 간략히 서술하시오.
실행 컨텍스트가 소스코드를 실행하기 위해 내부적으로 관리하는 세 가지 주요 구성 요소를 쓰고, 각각의 역할을 간략히 설명하시오.
3. 코드의 출력값을 쓰고, 그 이유를 서술하시오.
4. 다음 코드 실행 시, if 블록 내부와 외부의 스코프 구조가 어떻게 달라지는지 실행 컨텍스트 관점에서 서술하시오.