Skip to content

[week2_SOHYUN] 2주차 퀴즈#6

Open
Sohyunnnn wants to merge 1 commit intomainfrom
week2_SOHYUN
Open

[week2_SOHYUN] 2주차 퀴즈#6
Sohyunnnn wants to merge 1 commit intomainfrom
week2_SOHYUN

Conversation

@Sohyunnnn
Copy link
Collaborator

@Sohyunnnn Sohyunnnn commented Nov 3, 2025

1. OX 퀴즈

  1. 소스코드의 평가 과정에서는 변수와 함수의 선언문만 먼저 실행되어 식별자를 스코프(렉시컬 환경의 환경 레코드)에 등록하고, 소스코드의 실행 과정에서는 등록된 식별자에 값을 할당하거나 참조한다. (O/X)

  2. 실행 컨텍스트가 생성될 때마다 새로운 렉시컬 환경(Lexical Environment) 이 함께 생성되며, 렉시컬 환경이 스코프 체인(Scope Chain) 을 구성하는 기반이 된다. (O/X)

2. 다음 내용을 간략히 서술하시오.

실행 컨텍스트가 소스코드를 실행하기 위해 내부적으로 관리하는 세 가지 주요 구성 요소를 쓰고, 각각의 역할을 간략히 설명하시오.

3. 코드의 출력값을 쓰고, 그 이유를 서술하시오.

const a = 1;

function outer() {
  const b = 2;
  function inner() {
    console.log(a, b, c);
  }
  inner();
}

outer();
const c = 3;

4. 다음 코드 실행 시, if 블록 내부와 외부의 스코프 구조가 어떻게 달라지는지 실행 컨텍스트 관점에서 서술하시오.

let x = 1;

if (true) {
  let x = 10;
  const y = 20;
  console.log(x + y);
}

console.log(x);

@Tnalxmsk
Copy link
Collaborator

Tnalxmsk commented Nov 3, 2025

  1. OX 퀴즈
  2. 소스코드의 평가 과정에서는 변수와 함수의 선언문만 먼저 실행되어 식별자를 스코프(렉시컬 환경의 환경 레코드)에 등록하고, 소스코드의 실행 과정에서는 등록된 식별자에 값을 할당하거나 참조한다. (O/X)
  3. 실행 컨텍스트가 생성될 때마다 새로운 렉시컬 환경(Lexical Environment) 이 함께 생성되며, 렉시컬 환경이 스코프 체인(Scope Chain) 을 구성하는 기반이 된다. (O/X)
  1. 소스코드의 평가 과정에서는 변수와 함수의 선언문만 먼저 실행되어 식별자를 스코프(렉시컬 환경의 환경 레코드)에 등록하고, 소스코드의 실행 과정에서는 등록된 식별자에 값을 할당하거나 참조한다. (O - 여기서 '먼저 실행'이라는 표현이 평가되어 등록된다라는 의미라면)

  2. 실행 컨텍스트가 생성될 때마다 새로운 렉시컬 환경(Lexical Environment) 이 함께 생성되며, 렉시컬 환경이 스코프 체인(Scope Chain) 을 구성하는 기반이 된다. (O - 구체적으로 렉시컬 환경의 Outer Lexical Environment Reference)

2. 다음 내용을 간략히 서술하시오.

실행 컨텍스트가 소스코드를 실행하기 위해 내부적으로 관리하는 세 가지 주요 구성 요소를 쓰고, 각각의 역할을 간략히 설명하시오.

VariableEnvironment

  • 현재 실행 중인 코드의 변수 선언 정보 저장. var 변수, 함수 선언문 등의 식별자를 등록하는 용도 사용

LexicalEnvironment

  • 식별자와 값이 실제 저장되고, 스코프 체인을 구성하는 핵심 구조. let, const, 함수 매개변수 등이 등록되며 Outer Lexical Enviroment Reference를 통해 상위 스코프 참조

ThisBinding

  • 실행 중인 코드 블록에서 this 키워드가 어떤 객체를 참조할지 결정하고 저장. 호출 방식에 따라 다르게 바인딩

3. 코드의 출력값을 쓰고, 그 이유를 서술하시오.

const a = 1;

function outer() {
  const b = 2;
  function inner() {
    console.log(a, b, c);
  }
  inner();
}

outer();
const c = 3;

참조 에러

let, const로 정의된 변수는 var 키워드 변수와는 달리 평가 단계에서 undefined로 초기화되지 않음. 로 표현되어 TDZ 상태에 놓이게 됨
현재 코드 실행 순서 상 const c = 3; 할당문을 실행하기 전 outer 함수를 호출했으므로 TDZ 상태에 놓인 c를 inner 함수가 내부에서 참조하려 하기 때문에 에러 발생하는 것.

  1. 다음 코드 실행 시, if 블록 내부와 외부의 스코프 구조가 어떻게 달라지는지 실행 컨텍스트 관점에서 서술하시오.
let x = 1;

if (true) {
  let x = 10;
  const y = 20;
  console.log(x + y);
}

console.log(x);

전역 평가 단계를 진행하여 전역 실행 컨텍스트를 생성하고 전역 렉시컬 환경의 선언적 환경 레코드에 식별자 x 등록

실행 단계에서 x = 1로 초기화하며 값 바인딩

if 블록에 진입해 새로운 실행 컨텍스트를 만들지 않고 블록 레벨 스코프를 생성. 이때 생성된 렉시컬 환경의 OuterLexicalEnvironmentReference는 if 문이 실행되기 이전 전역 렉시컬 환경을 가리킴
if 블록의 렉시컬 환경 또한 평가와 실행 단계를 거치고 console 객체를 스코프 체인을 통해 찾은 후 log 메서드를 찾고 x 와 y를 렉시컬 환경의 환경 레코드에서 x, y 식별자 검색을 진행한 후 console.log(x + y) 출력

블록의 코드 수행이 종료되면 다시 기ㅣ존의 전역 렉시컬 환경으로 교체하고 console.log(x) 또한 검색 과정을 통해 출력된 후 전역 실행 컨텍스트가 pop 되어 종료

@qowjdals23
Copy link
Collaborator

Q1.

  1. 소스코드의 평가 과정에서는 변수와 함수의 선언문만 먼저 실행되어 식별자를 스코프(렉시컬 환경의 환경 레코드)에 등록하고, 소스코드의 실행 과정에서는 등록된 식별자에 값을 할당하거나 참조한다. (O)

  2. 실행 컨텍스트가 생성될 때마다 새로운 렉시컬 환경(Lexical Environment) 이 함께 생성되며, 렉시컬 환경이 스코프 체인(Scope Chain) 을 구성하는 기반이 된다. (O)

Q2.

  • Variable Environment (변수 환경) : 초기 선언 단계에서 생성되며, 변수 및 함수 선언 정보를 저장한다. 평가 단계에서 한 번 복사된 후 변경되지 않는다.
  • Lexical Environment (렉시컬 환경) : 식별자와 값의 바인딩 정보를 실시간으로 관리하며, 스코프 체인을 형성하는 핵심 구조다. Environment Record(식별자 저장소)와 Outer Lexical Environment Reference(상위 스코프 참조)로 구성된다.
  • This Binding (this 바인딩) : 실행 중 this 키워드가 어떤 객체를 참조할지 결정한다. (전역에서는 전역 객체, 함수 호출 방식에 따라 달라진다.

Q3.
결과:
ReferenceError

이유:

  • 평가 단계에서 a, outer, c가 전역 스코프에 등록되지만, const c는 아직 초기화되지 않아 TDZ에 있다.
  • 실행 단계에서 outer()가 호출되고, inner() 실행할 때 console.log(a, b, c)가 평가된다.
    • a는 전역 스코프에서 찾아 1을 참조
    • b는 outer 스코프에서 찾아 2를 참조
    • c는 전역 스코프에 선언되어 있지만 아직 초기화 되지 않아 TDZ 상태이므로 접근 불가

따라서 ReferenceError가 발생한다.

Q4.

30
1

이유:

  • 코드가 실행되면 먼저 전역 실행 컨텍스트가 생성되어 전역 스코프에서 let x = 1이 등록된다.
  • 이후 if (true) 블록이 실행되면 새로운 블록 렉시컬 환경이 만들어지고, 이 안에서 let x = 10, const y = 20이 선언된다.
  • 블록 내부에서 console.log(x + y)를 실행할 때, 현재 스코프(블록 환경)에서 x = 10, y = 20을 찾아 합산하므로 30이 출력된다.
  • if 블록이 끝나면 블록 렉시컬 환경은 제거되고, 다시 전역 스코프로 돌아온다.
  • 전역의 x = 1만 남아 있으므로 console.log(x)는 1을 출력한다.

@mimizae
Copy link
Collaborator

mimizae commented Nov 4, 2025

Q1. OX 퀴즈

  1. 소스코드의 평가 과정에서는 변수와 함수의 선언문만 먼저 실행되어 식별자를 스코프(렉시컬 환경의 환경 레코드)에 등록하고, 소스코드의 실행 과정에서는 등록된 식별자에 값을 할당하거나 참조한다. (O)

  2. 실행 컨텍스트가 생성될 때마다 새로운 렉시컬 환경(Lexical Environment) 이 함께 생성되며, 렉시컬 환경이 스코프 체인(Scope Chain) 을 구성하는 기반이 된다. (O)

Q2. 실행 컨텍스트가 소스코드를 실행하기 위해 내부적으로 관리하는 세 가지 주요 구성 요소를 쓰고, 각각의 역할을 간략히 설명하시오.

실행 컨텍스트가 내부적으로 관리하는 주요 구성 요소는
식별자의 등록과 상태 변화 관리, 스코프 체인 관리, 코드 실행 순서 제어이다.

  1. 식별자의 등록과 상태 변화 관리
    선언에 의해 생성된 모든 식별자(변수, 함수, 클래스 등)를 스코프를 구분하여 등록하고 상태 변화(식별자에 바인딩된 값의 변화)를 지속적으로 관리할 수 있어야 한다. (해당 식별자에 어떤 값이 할당되는지)

  2. 스코프 체인 관리
    스코프는 중첩 관계에 의해 스코프 체인을 형성해야 한다. 즉, 스코프 체인을 통해 상위 스코프로 이동하며 식별자를 검색할 수 있어야 한다.

  3. 코드 실행 순서 제어
    현재 실행 중인 코드의 실행 순서를 변경(예를 들어, 함수 호출에 의한 실행 순서 변경)을 할 수 있어야 하며 다시 되돌아갈 수도 있어야 한다.

실행 컨텍스트에 의해 위 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()가 호출된다.
이 시점에는 c에 아직 값이 할당되지 않았기 때문에 여전히 TDZ 상태이다...

outer() 호출 시 새로운 실행 컨텍스트가 생성되고, 지역 변수 b와 내부 함수 inner가 outer 렉시컬 환경의 환경 레코드에 등록된다.

이후 b = 2가 실행되어 값이 할당된다. 그 다음 inner()가 호출된다.

inner() 실행 시 console.log(a, b, c)를 평가하기 위해 스코프 체인을 따라 식별자를 탐색한다.

  • a → 전역 스코프에서 찾아 값이 1로 출력된다.

  • b → outer 스코프에서 찾아 값이 2로 출력된다.

  • c → 전역 스코프에서 찾지만, 아직 TDZ에 있어서 참조할 수 없다! 따라서 ReferenceError가 발생한다.
    (outer() 실행이 끝나고 그 이후에야 c = 3이 실행되므로, inner()가 실행될 때는 c가 아직 초기화되지 않은 상태이다.)

Q4. 다음 코드 실행 시, if 블록 내부와 외부의 스코프 구조가 어떻게 달라지는지 실행 컨텍스트 관점에서 서술하시오.

코드가 처음 실행되면 let x = 1; 문이 평가되어 전역 스코프에 변수 x가 등록되고 값 1이 할당된다. 이 시점에서 전역 스코프에는 x라는 이름의 식별자가 존재하며, 이 값은 전역 실행 컨텍스트 내의 환경 레코드(Environment Record)에 저장된다.

그 다음 if (true) 문이 실행된다. if 문은 블록문(block statement)이기 때문에 새로운 블록 스코프(Block Lexical Environment) 를 생성한다.

이 블록 스코프는 전역 스코프를 바깥 환경으로(Outer Environment Reference) 참조하는 별도의 렉시컬 환경이다.

블록 내부에서 let x = 10; const y = 20;이 선언되면, 이 둘은 전역 스코프의 변수와는 완전히 독립적인 새로운 식별자로 블록 스코프 안에 저장된다.

따라서 블록 내부의 x는 전역의 x가리는 역할을 하며, 같은 이름을 갖더라도 서로 다른 메모리 공간에 존재한다.

이후 console.log(x + y);가 실행될 때, 자바스크립트 엔진은 스코프 체인을 따라 변수 xy를 탐색한다.

가장 가까운 블록 스코프에 x = 10y = 20이 존재하므로, 이 값들이 사용되어 30이 출력된다.

이때 전역 스코프의 x = 1에는 전혀 접근하지 않는다!!

if 블록의 실행이 끝나면 해당 블록의 렉시컬 환경은 실행 컨텍스트 스택에서 제거되며, 내부에서 선언된 xy 변수 역시 메모리에서 해제된다.

이제 남은 것은 전역 스코프의 실행 컨텍스트뿐이며, 전역 변수 x는 여전히 값 1을 가지고 있다.

마지막 줄의 console.log(x);가 실행되면, 블록 스코프가 사라졌기 때문에 전역 스코프의 x가 참조되어 1이 출력된다.

Copy link
Member

@jstar000 jstar000 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Q1.

  1. (O)
  2. (O)

Q2.

  1. LexicalEnvironment
    식별자와 식별자에 바인딩된 값을 관리하는 저장소
    Environment Record와 Outer Lexical Environment Reference로 구성됨
    스코프와 스코프 체인을 구현
  2. VariableEnvironment
    초기에는 LexicalEnvironment와 동일한 Lexical Environment를 참조하다가, 필요시 분리됨
  3. 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를 가리킴

@sonnnnhe
Copy link
Collaborator

sonnnnhe commented Nov 4, 2025

Q1

  1. O
  2. O

Q2

Lexical Environment
식별자와 실별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조이다.

Variable Environment
렉시컬 환경 생성 초기에 Lexical Environment와 동일한 렉시컬 환경을 참조하다가 특정 상황에서 Variable Environment 컴포넌트를 위한 새로운 렉시컬 환경을 참조하면서 내용이 달라지는 경우가 있다.

this binding
this 키워드가 참조할 객체를 저장한다.


Q3

출력값: ReferenceError

전역 객체 생성 후 전역 코드 평가 과정에서 전역 렉시컬 환경의 객체 레코드에 식별자 outer가 함수 객체가 할당된 상태로 등록되고, 선언적 환경 레코드에 식별자 a, c가 초기화되지 않은 상태로 등록된다.
평가 과정이 끝나고 전역 코드 실행이 순차적으로 이루어지면서 a에 값을 할당하고 outer 함수를 호출하여 outer 함수 코드 평가 과정이 시작된다.

초기화되지 않은 식별자 b와 함수 객체가 할당된 식별자 inner를 outer 함수 환경 레코드에 등록하고 함수 코드 실행 과정에서 식별자 b에 2를 할당, inner 함수를 호출한다.

inner 함수 코드 평가 과정이 끝난 후 inner 함수 코드가 순차적으로 실행되어 식별자 a, b, c 검색을 시작하는데, a는 전역 환경 레코드, b는 outer 환경 레코드에서 찾았지만 c는 전역 환경 레코드에 초기화되지 않은 상태로 등록되어 있었기 때문에 초기화되지 않은 식별자를 참조하면서 참조 에러가 발생한다.


Q4

전역 객체 생성 후 전역 코드 평가 과정에서 전역 렉시컬 환경의 선언적 환경 레코드에 식별자 x가 초기화되지 않은 상태로 등록된다.
전역 코드 평가가 끝나고 전역 코드 실행이 시작되면서 식별자 x에 1이 할당되고 if 문의 코드 블록이 실행된다.
이때 if 문의 코드 블록을 위한 블록 레벨 스코프를 생성해야 해서 선언적 환경 레코드를 갖는 렉시컬 환경을 새롭게 생성하여 기존의 전역 렉시컬 환경을 교체하는데,
기존의 전역 렉시컬 환경은 if 문의 코드 블록을 위한 렉시컬 환경의 외부 렉시컬 환경에 대한 참조로 할당된다.

if 문의 코드 블록이 새로운 실행 컨텍스트를 생성하지 않으므로 실행 컨텍스트 스택에는 전역 실행 컨텍스트만 존재한다.
즉, 전역 실행 컨텍스트가 if 문의 코드 블록을 위한 렉시컬 환경을 참조하는 것이다.

@eunkr82
Copy link
Collaborator

eunkr82 commented Nov 4, 2025

A1.

  1. O
  2. O

A2.

  1. Lexical Environment
    현재 스코프에서 선언된 변수, 함수, 매개변수를 기록하고, 외부 랙시컬 환경에 대한 참조를 저장한다. 이를 통해 식별자 검색이 가능하다.
  2. Variable Environment
    초기 선언 단계에서 한번 저장되는 환경. Environment Record와 Outer Lexical Environment Reference로 구성된다.
  3. this binding
    현재 실행 중인 코드에서 this가 무엇을 가리키는지 결정한다. 함수 호출 방식에 따라 값은 달라질 수 있다.

A3.

[실행 결과] ReferenceError
inner 함수 실행 시 c를 찾으려 하나, const로 선언되었기 때문에 TDZ에 존재한다. 즉, 코드상에서 c=3 이 실행되기 이전에 사용되었으므로 참조 에러가 발생한다.

A4.

let x = 1;

if (true) {
  let x = 10;
  const y = 20;
  console.log(x + y);
}

console.log(x);

[실행 결과]
30
1

  • 전역 실행 컨텍스트가 생성되고, 렉시컬 환경에 x=1이 등록된다.
  • if 문은 블록 단위 스코프를 생성한다(별도의 렉시컬 환경을 가진다). 따라서 if 블록 내부에서 선언된 let x와 const y는 블록 스코프에만 존재하는 변수다.

@Sohyunnnn
Copy link
Collaborator Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants