inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

코어 자바스크립트

실행 컨텍스트 (execution context)

실행 컨텍스트 안의 VariableEnvironment 를 존재 이유가 궁금합니다.

해결된 질문

468

HIRU

작성한 질문수 4

2

안녕하세요, 선생님 강의 잘 듣고 있습니다! 감사합니다~

VariableEnvironment는 LexicalEnvrionment의 초기 정보만 담고 있고 이후에는 LexicalEnvrionment를 주로 활용하게 된다고 하셨는데요. 

그렇다면 VariableEnvironment가 사용되는 경우는 어떤 경우일지 궁금해서 질문 남깁니다. 

 

감사합니다.

javascript

답변 1

4

정재남

------- 공식스펙 (1) ----------
https://tc39.es/ecma262/#sec-block

  1. Let oldEnv be the running execution context's LexicalEnvironment.
  2. Let blockEnv be NewDeclarativeEnvironment(oldEnv).
  3. Perform BlockDeclarationInstantiation(StatementListblockEnv).
  4. Set the running execution context's LexicalEnvironment to blockEnv.
  5. Let blockValue be the result of evaluating StatementList.
  6. Set the running execution context's LexicalEnvironment to oldEnv.
  7. Return blockValue.
NOTE 1 | No matter how control leaves the Block the LexicalEnvironment is always restored to its former state.

 

------- 공식스펙 (2) ----------
https://tc39.es/ecma262/#sec-execution-contexts

An execution context is purely a specification mechanism and need not correspond to any particular artefact of an ECMAScript implementation. It is impossible for ECMAScript code to directly access or observe an execution context.

-------------------------------

 

제가 확인한 VariableEnvironment가 사용되는 유일한 케이스는
with구문 또는 block scope와 관련이 있습니다.
그 중 block scope는 별도의 execution context를 생성하지는 않고,
현재의 execution context를 유지한 상태에서
'임시의' LexicalEnvironment만을 생성하여
그 내부에서 let 또는 const로 선언한 변수들을 관리합니다.
그러다가 해당 scope가 종료되는 시점에는 다시
원래상태의 LexicalEnvironment로 복구해야 하는데,
그러기 위해 VariableEnvironment가 참조하고 있는
(원래의 LexicalEnvironment도 동일하게 참조하고 있는) 변수들을 찾아 복구합니다.

공식 스펙(1)에는 위와 같은 내용이 명시되지 않았습니다.
다만 이렇게 해석하는 글을 많이 봐왔기에 소개드리는 것입니다.

오히려 공식스펙(2)에서는,
"이런 개념은 어디까지나 순수한 메커니즘에 불과하다"고 하여,
모든 자바스크립트 엔진이 "정확히 이렇게 동작하도록 구현되어 있어야만 한다"는 식의
강제성이 없음을 명시하고 있습니다.
즉 어떤 자바스크립트 엔진이 내부적으로 아예 VE를 구현조차 하지 않았더라도
전혀 문제되지 않는 스펙인 것이죠.

그러니까 'VariableEnvironment는 개념상 이런 존재로구나'
정도로만 파악하고 넘기시길 추천드립니다.

혹시 보다 정확한 자료를 찾게 되신다면 공유 부탁드릴게요!

0

HIRU

선생님, 신속한 답변 감사합니다.

맛있는 저녁 드시고 평안한 저녁 보내세요. 

항상 감사드립니다. 무료 강의도 재미있게 볼게요 감사합니다~

인스턴스에서 prototype 프로퍼티에 직접 접근해야하는 이유

0

73

1

setTimeout 에서 this

0

95

1

2강부터 영상이 나오지 않습니다.

0

190

1

자바스크립트 주석에 이상한 점이 있어서 문의드립니다.

0

235

2

return 문 안에 여러 함수가 존재하는 것이 이해되지 않습니다.

1

274

1

클래스 static 멤버

1

256

1

실행컨텍스트와 스택프레임

2

574

1

프로토타입으로 상속할때 브릿지 사용 이유

0

328

1

호이스팅 관련 질문

1

342

1

책 66p. 예제 3-2 질문입니다.

0

360

1

강의 내용 10:58 캡슐화 질문입니다.

1

405

1

강의 내용 5:10 질문입니다.

1

425

2

전역 공간에서의 this

0

431

2

18:31 addEventListener의 this

1

488

1

outerEnvironmentReference 질문

1

376

1

실행 컨텍스트와 클로저에 대해 질문드립니다.

1

455

1

Object.prototype.constructor의 [[prototype]] ?

1

661

1

함수를 값으로 할당할 때

2

462

1

15:54 'ddd' 사라지는 오류?

4

382

1

프로토타입 getPrototypeOf(instance).constructor(n,a) 질문입니다.

1

410

1

기본형/가변형 질문입니당

0

336

0

선생님 그러면 섹션 0만 봐도 무방한가요!?

0

341

1

Hoisting과 environmentRecord에 관한 질문입니다.

1

295

1

안녕하세요, 데이터 변경 질문입니다.

0

335

1