Conversation
변수 fn에는 outer 함수 호출의 반환값 inener 함수 할당 스코프는 정의된 위치에 의해 결정 -> 렉시컬 스코프 규칙임. console.log(x)에서 x 평가 시 inner 함수의 렉시컬 환경의 환경 레코드에서 식별자 x를 찾음. 해당 환경 레코드에는 x가 존재하지 않으므로 OuterLexcialEnvironentReference가 가리키는 outer의 렉시컬 환경으로 이동. 해당 렉시컬 환경의 환경 레코드에는 식별자 x가 존재하므로 식별자 검색을 마치고 console.log(20)이 되어 20 출력 fn === inner는 전역에서 호출되었지만 정의는 outer 함수 내부에서 정의되어 있음. 따라서 전역에서 정의된 const x = 10은 전역 렉시컬 환경의 선언적 환경 레코드에 등록되어 있으나 이미 outer 함수의 환경 레코드에 등록된 x를 찾았으므로 스코프 체인을 종료하므로 전역 렉시컬 환경의 선언적 레환경 레코드까지 도달하지 않음
전역 객체 생성 이후 전역 코드 평가 단계에 진입. 이때 전역 실행 컨텍스트와 전역 렉시컬 환경을 생성해 전역 렉시컬 환경을 실행 컨텍스트에 바인딩함 위 코드에서 const 키워드로 선언한 변수 x, y는 전역 렉시컬 환경의 선언적 환경 레코드의 식별자로 등록되며 undefined가 초기화되는 것이 아닌 uninitialiezd로 표현됨. 이것은 TDZ에 진입해 있는 것을 의미 이후 전역 코드가 실행되어 foo 함수를 호출함. 호출 시 전역 코드 실행이 중지되고, foo 함수 코드 제어권 받음 foo 함수 실행 컨테스트 생성 및 렉시컬 환경 생성 후 바인딩 이후 console.log(a + x + y)에서 console 객체를 찾기 위해 OuterLexicalEnvironmentReference가 참조하는 전역 렉시컬 환경으로 이동해 객체 환경 레코드의 BindingObject를 통해 console 찾고 log 메서드를 찾은 후 a, x, y를 각각 렉시컬 환경과 OuterLexicalEnvironmentReference의 스코프 체인에 따라 각 식별자를 검색함. a, x, y는 각각 파라미터, 지역 변수로 foo 함수의 렉시컬 환경에 등록되어 있으므로 100 + 10 + 20 = 130이 되어 130출력 후 실행 종료 전역 console 또한 동일한 과정 수행 이후 3 출력하고 실행 종료 정리하면 실행 컨텍스트 생성 시점에선 코드 평가가 이루어지며 렉시컬 환경 또한 생성해 실행 컨텍스트에 바인딩함. 이때 해당 평가 단계에서 존재하는 변수, 함수 등을 환경 레코드에 등록하고 실행 단계로 넘어가 환경 레코드에서 식별자를 확인하거나 OuterLexicalEnvironmentReference의 스코프 체인을 통해 거슬러 올라가 확인하는 과정을 거침
참조 에러: d 정의 안됨 a 검색
b 검색
c 검색
d 검색
렉시컬 스코프는 정의 위치에의 정해지기 때문에 inner -> middle -> outer -> global 순으로 스코프 체인 연결
(1) 자바스크립트에서 함수가 호출될 때마다 새로운 실행 컨텍스트가 생성된다. (O) (2) 실행 컨텍스트 스택(Call Stack)에서 맨 위(top)에 있는 컨텍스트가 현재 실행 중인 코드의 실행 컨텍스트다. (O) (3) 렉시컬 스코프는 함수가 “호출되는 시점”의 위치를 기준으로 결정된다. (X) |
|
Q1.
Q2.
Q3. 평가 단계
실행 단계
Q4.
Q5. (1) 자바스크립트에서 함수가 호출될 때마다 새로운 실행 컨텍스트가 생성된다. (O) |
jstar000
left a comment
There was a problem hiding this comment.
Q1.
출력 결과: 20
전역 코드 평가 과정에서 전역 객체와 전역 실행 컨텍스트, 전역 Lexical Environment가 생성되고, x, outer, fn이 전역 Lexical Environment에 등록된다.
전역 코드가 실행되면 x에 10이 할당되고, const fn = outer() 코드가 실행된다.
이때 outer 함수가 호출되고, outer 함수 내부로 코드 제어권이 이동하며 함수 코드 평가에 의해 outer 함수의 실행 컨텍스트와 함수 Lexical Environment가 생성된다.
함수 Lexical Environment에는 x와 inner가 등록되고, 리턴문에 의해 outer 함수가 종료되며 코드 제어권이 전역 코드로 되돌아가고 fn에는 inner 함수가 반환된다.
전역 코드의 fn()문이 실행된다. 이는 사실상 inner 함수의 호출과 같으며, inner 함수 실행 컨텍스트와 Lexical Environment가 생성되고 console.log(x) 구문이 실행된다.
자바스크립트에서 상위 스코프는 렉시컬 스코프(상위 스코프가 동적으로 변하지 않고 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정)에 의해 결정된다. 따라서 변수 x의 검색 과정에서 스코프 체인에 의해 상위 스코프인 outer 함수의 Lexical Environment로 이동하고, outer 함수의 Environment Record에 등록된 x를 찾아 최종적으로 20을 출력한다.
Q2.
실행 결과:
first start
second
first end
-
전역 코드 평가와 실행
JS 엔진이 전역 코드를 평가하며 전역 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시함 -
first함수가 실행되며first함수 코드 평가와 실행 진행
first함수 코드가 실행되며 코드 제어권이 전역 코드에서first함수로 이동하며, JS 엔진은first함수 내부의 함수 코드를 평가하며first함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시함 -
second함수가 실행되며second함수 코드 평가와 실행 진행
second함수 코드가 실행되며 코드 제어권이first함수에서second함수로 이동하며, JS 엔진은second함수 내부의 함수 코드를 평가하며second함수 실행 컨텍스트를 생성하고 실행 컨텍스트 스택에 푸시함. -
console.log("second")출력 후second함수 실행이 종료되며 실행 컨텍스트 스택에서 pop됨 -
코드 제어권이 다시
first함수로 돌아가며, first 함수의console.log('first end')출력 후first함수 실행이 종료되며 실행 컨텍스트 스택에서 pop됨 -
코드 제어권이 다시 전역 코드로 돌아오며, 더이상 실행할 코드가 없으므로 전역 실행 컨텍스트가 싨행 컨텍스트 스택에서 pop됨
Q3.
전역 객체가 생성되고 전역 코드 평가 과정에서 전역 실행 컨텍스트와 전역 Lexical Environment가 생성됨. const 키워드로 선언된 변수인 x와 y는 전역 Lexical Environment의 Declarative Environment Record에 uninitialized 상태로 등록되고, foo 함수는 Object Environment Record에 등록되며 등록과 동시에 함수 객체로 초기화됨
전역 코드 실행 과정에서 uninitialized 상태였던 x와 y에 각각 1, 2라는 값이 할당된 후 foo 함수가 실행됨. 이때 코드 제어권이 전역 코드에서 foo 함수 내부로 이동하며, foo 함수의 코드 평가가 시작되고 foo 함수 실행 컨텍스트와 foo 함수 Lexical Environment가 생성됨. 함수 내부의 x, y는 함수 Environment Record에 uninitialized 상태로 등록됨.
함수 코드 실행 과정에서 uninitialized 상태였던 x와 y에 각각 10, 20이라는 값이 할당된 후 console.log(a + x + y) 코드가 실행됨. console 키워드는 스코프 체인을 통해 전역 스코프로 이동한 후 전역 객체에서 찾고, x와 y는 스코프 체인의 시작지점인 foo 함수의 Lexical Environment에서 찾음. 변수 a는 현재 스코프에서 찾을 수 없으므로 OuterLexicalEnvironmentReference에 등록된 스코프인 상위 스코프, 즉 전역 스코프로 이동해 변수 a를 탐색하는데, Global Environment Record에서도 해당식별자를 찾을 수 없으므로 ReferenceError가 발생함.
그 뒤에 전역 코드의 console.log(x+y)가 정상적으로 실행된다고 가정한다면 x와 y라는 식별자를 현재 스코프인 전역 Lexical Environment에서 검색하며, 이미 선언과 할당이 끝난 x, y값을 찾을 수 있으므로 3이 출력됨.
Q4.
전역 객체가 생성되고, 전역 코드 평가 과정에서 const 키워드로 선언된 변수인 a가 전역 Lexical Environment(Declarative Environment Record)에 등록, outer 함수는 Object Environment Record에 등록됨
outer 함수가 실행되고, outer 함수의 실행 컨텍스트와 Lexical Environment가 생성되며 변수 b와 함수 middle이 outer 함수 Environment Record에 등록됨.
middle 함수가 실행되고, middle 함수의 실행 컨텍스트와 Lexical Environment가 생성되며 변수 c와 함수 inner가 middle 함수 Environment Record에 등록됨.
inner 함수가 실행되고, console.log(a, b, c, d)에서 변수 a, b, c, d의 검색을 시작함.
스코프 체인에 의해 현재 Lexical Environment에서부터 식별자를 찾기 시작하고, 검색에 실패할 시 Lexical Environment의 OuterLexicalEnvironmentReference로 상위 스코프로 이동하며 해당 Lexical Environment에서 식별자를 찾는 과정을 반복함.
식별자 a, b, c는 각각 전역, outer, middle의 Lexical Environment에서 찾을 수 있으며, 식별자 d는 스코프 체인을 통해 전역 Lexical Environment까지 이동했음에도 찾을 수 없으므로 ReferenceError가 발생함.
Q5.
(1) (O)
(2) (O)
(3) (X), 자바스크립트에서 상위 스코프는 렉시컬 스코프(상위 스코프가 동적으로 변하지 않고 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정)
Q1출력 결과: 20
Q2실행 결과
Q3
Q4Reference Error
Q5(1) O |
Q1.아래 코드의 출력 결과를 쓰시오. 그 이유를 렉시컬 스코프 관점에서 설명하시오. const x = 10;
function outer() {
const x = 20;
function inner() {
console.log(x);
}
return inner;
}
const fn = outer();
fn();20렉시컬 스코프는 함수가 어디서
Q2.아래 코드의 실행 결과를 순서대로 쓰고, 코드 실행 중 **실행 컨텍스트 스택(Call Stack)**의 변화 과정을 단계별로 설명하시오. var x = 1;
function first() {
console.log("first start");
second();
console.log("first end");
}
function second() {
console.log("second");
}
first();first start
second
first end
Q3.아래 코드가 호이스팅(hoisting) 된다면, 자바스크립트 엔진이 실제로 평가 단계에서 어떤 코드 구조로 인식하고 실행하는지 작성하시오. 또한 실행 컨텍스트 생성 시점(평가 단계)과 코드 실행 시점(실행 단계)에서 무슨 일이 일어나는지 간략히 설명하시오. const x = 1;
const y = 2;
function foo(a) {
const x = 10;
const y = 20;
console.log(a + x + y);
}
foo(100);
console.log(x + y);130
3자바스크립트는 코드를 실행하기 전에, 먼저 선언문만 끌어올려(hoisting) 스코프에 등록 이때 function은 전체가 호이스팅되고, const/let은 선언만 올라가며 TDZ에 들어감. (1) 전역 코드 평가
(2) 전역 코드 실행
(3)
(4)
(5) 전역 코드 계속 실행
Q4.아래의 코드 실행 시 에러가 발생한다면 어떤 에러인지 쓰고, 자바스크립트 엔진이 inner 실행 시 a, b, c, d를 검색하는 과정을 실행 컨텍스트의 렉시컬 환경 구성 기준으로 단계별로 간략히 설명하시오. const a = 1;
function outer() {
const b = 2;
function middle() {
const c = 3;
function inner() {
console.log(a, b, c, d);
}
inner();
}
middle();
}
outer();ReferenceError
Q5.아래의 문제를 푸시오. (1) 자바스크립트에서 함수가 호출될 때마다 새로운 실행 컨텍스트가 생성된다. (O) (2) 실행 컨텍스트 스택(Call Stack)에서 맨 위(top)에 있는 컨텍스트가 현재 실행 중인 코드의 실행 컨텍스트다. (O) (3) 렉시컬 스코프는 함수가 “호출되는 시점”의 위치를 기준으로 결정된다. (X) |
A1.[실행 결과] 20 A2,[실행 결과]
A3.const x = 1;
const y = 2;
function foo(a) {
const x = 10;
const y = 20;
console.log(a + x + y);
}
foo(100);
console.log(x + y);
A4.
A5.
|
|
정답 노션 링크 첨부합니다! 아자잣!!!! |
Q1.
아래 코드의 출력 결과를 쓰시오.
그 이유를 렉시컬 스코프 관점에서 설명하시오.
Q2.
아래 코드의 실행 결과를 순서대로 쓰고, 코드 실행 중 실행 컨텍스트 스택(Call Stack)의 변화 과정을 단계별로 설명하시오.
Q3.
아래 코드가 호이스팅(hoisting) 된다면, 자바스크립트 엔진이 실제로 평가 단계에서 어떤 코드 구조로 인식하고 실행하는지 작성하시오.
또한 실행 컨텍스트 생성 시점(평가 단계)과 코드 실행 시점(실행 단계)에서 무슨 일이 일어나는지 간략히 설명하시오.
Q4.
아래의 코드 실행 시 에러가 발생한다면 어떤 에러인지 쓰고, 자바스크립트 엔진이 inner 실행 시 a, b, c, d를 검색하는 과정을 실행 컨텍스트의 렉시컬 환경 구성 기준으로 단계별로 간략히 설명하시오.
Q5.
아래의 문제를 푸시오.
(1) 자바스크립트에서 함수가 호출될 때마다 새로운 실행 컨텍스트가 생성된다. (O/X)
(2) 실행 컨텍스트 스택(Call Stack)에서 맨 위(top)에 있는 컨텍스트가 현재 실행 중인 코드의 실행 컨텍스트다. (O/X)
(3) 렉시컬 스코프는 함수가 “호출되는 시점”의 위치를 기준으로 결정된다. (O/X)