• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

궁금해서 명세를 찾아봤는데요

20.12.18 23:35 작성 조회수 108

1

lexical environment라는 것은 제거되는 것이 아니지 않나요?

인터프리터에 의해 해석되는 자바스크립트임에도 불구하고, 분명 compiler가 js를 먼저 해석하고 그때 compilation 단계에서 lexical environment가 생성되죠.

그리고, 정확히말하자면 execution context의 구성요소로 lexical environment 정보를 담은 record가 있는 것이구요. 

함수가 종료되면 excution context는 제거 됩니다. 하지만 return으로 반환된 함수가 실행될때 생성되는 lexical environement는 그 이전 함수 실행 컨텍스트의 구성요소로 들어가는 lexical environment record를 참조하는 것이 아니라, lexing time에 이미 만들어진 lexical environment를 참조하고, 이 lexical environment는 outer lexical environment에 대한 reference를 가지고 있기 때문에 참조가 가능한 것 아닌가요? 

답변 3

·

답변을 작성해보세요.

1

비오님의 프로필

비오

질문자

2020.12.19

네 감사합니다.

1

안녕하세요
제가 질문을 잘 이해한건지 모르겠지만, 아래처럼 이해했습니다
```
lexical environment 는 함수 호출 시점이 아니라 함수 정의 시점에 생성되는 것 아닌가?
그리고 함수 실행 시점에는 정의된 시점에 생성된 lexical environment 를 단순히 참조하는 것 아닌가?
```

위 질문에 대해 답을 하자면 함수 호출 시점에 생성되는 게 맞는 것 같습니다
ES 명세에 아래 문장이 있는데요,
```
A function environment is a Lexical Environment that corresponds to the invocation of an ECMAScript function object
```
invocation 이라는 단어로 보아 호출 시점에 생성되는 것 같습니다
https://www.ecma-international.org/ecma-262/#sec-lexical-environments

javascript.info 의 아래 문장은 좀 더 구체적으로 함수 호출 시점을 언급하고 있습니다
```
When a function runs, at the beginning of the call, a new Lexical Environment is created automatically to store local variables and parameters of the call.
```
https://javascript.info/closure#step-3-inner-and-outer-lexical-environment

개인이 답한 내용이긴하지만 stackoverflow 의 아래 내용도 함수 호출 시점을 얘기하고 있습니다
```
Now, for every execution context -- 1) a corresponding lexical environment is created
```
https://stackoverflow.com/a/50174232/12896859

그리고 함수 호출 시점에 lexical environment 가 생성되는 게 맞다면, 함수 실행이 종료되는 시점에 제거되는 게 맞을 것 같네요
사실 ES 명세에도 나와있지만 lexical environment 는 명세를 위한 정의일뿐, js 엔진을 구현할 때는 각자 최적화 방식이 다를 수 있습니다

0

비오님의 프로필

비오

질문자

2020.12.18

표현이 장황해서 정확히 표현이 되었는지 모르겠습니다.
줄여서 표현하자면, 각 execution context가 가지는 Lexical environment가 참조하는 outer Lexical Environment에 대한 참조는 애초에 별개로 존재하는 것 아닌가 하는 질문입니다. 

일종의 pointer처럼요. 그래서 execution context가 stack에서 사라지더라도, 어짜피 그것은 참조이기 때문에 상관이 없다. 뭐 이런 생각이었습니다.