• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

선생님 스코프 생성 순서에 대한 질문입니다!

20.07.09 23:58 작성 조회수 92

0

 function book() {
   var point = 123;
   function show() {
     var title = "JS"
   };
   show();
 }
 book();

엔진이 function 키워드를 만나면 Function 오브젝트가 생성되고  [[scope]]에 함수밖의 함수과 변수을 설정합니다.

그리고 show() 함수가 호출될 때 실행 컨텍스트가 만들어지며 렉시컬 환경 컴포넌트의 외부 렉시컬 환경 참조안에 스코프가 설정되는 걸로 알고있습니다.

렉시컬 환경 컴포넌트 안에는 선언적 환경 레코드가 있고 그 안에는 함수 내부의 함수와 변수가 작성된다고 알고있습니다.

(혹시 제가 이해한 부분에 문제가 있다면 말씀부탁드리겠습니다..ㅠ)

1. 제가 질문 드리고싶은 부분은 선언적 환경레코드에 작성되는 함수 내부의 함수와 변수도 스코프인가요?

2. 외부 렉시컬 환경 참조와 선언적 환경레코드 중에 어느 것이 더 먼저 작성되나요?

3. [[scope]]가 작성되는 시점에는 point: 123 처럼 키와 밸류가 정확하게 들어가나요? undefined로 들어가지는 않나요?

([[scope]]가 작성되는 시점과 변수초기화 단계가 어떤순서인지 감이 안잡힙니다. )

4. [[scope]]가 설정되고 실행 컨텍스트가 생성되는 과정과 함수 엔진 처리 과정을 따로 생각하면 순서가 명확하게 이해가되는데 둘이 합쳐서 순서를 정하려니까 어느게 먼저인지 감이 안잡힙니다..ㅠ

function 오브젝트 생성 -> [[scope]] 작성 ->  변수 초기화 단계에서 undefined로 초기화 -> 코드 실행 단계에서 표현식에 작성된 값을 value로 설정해주고 show()가 실행되면서 실행컨텍스트를 만들고 DER, OLER에 [[scope]]설정(제 생각에는 이런거같은데 논리적으로 완벽하지 않은거같습니다..)

답변 2

·

답변을 작성해보세요.

1

찡태님의 프로필

찡태

질문자

2020.07.10

감사합니다!! 완벽하게는 아니여도 선생님의 답변을 보니 무엇을 착각해서 혼란이 왔는지 감이 잡혔습니다.

다시 정리해서 생각하면 될거같습니다!

좋은 강의와 질문에 대한 관심 감사드립니다.

1

1. 스코프 관점에서 보면 스코프입니다. 
- 왜냐하면 함수 안에서 먼저 식별자를 해결하기 때문입니다. 함수 안이라는 스코프입니다.

2. 순서가 영향을 미치지 않지만 환경을 설정하는 측면에서 보면 외부 렉시컬 환경 참조를 먼저 설정한다고 할 수 있습니다.

3. [[scope]]를 설정하는 시점에 값 123을 같이 설정합니다.  
값을 설정하지 않으면 point 변수를 사용할 때 값을 알 수 없기 때문입니다.
다만, 함수에서 point를 사용하기 전에 123이 바뀔 수 있다는 것입니다.

4. [[scope]] 설정과 사용을 분리해서 생각하면 정리가 될 것입니다.
- [[scope]]는 function 키워드를 만나 Function 오브젝트를 만드는 시점에 Function 오브젝트에 설정합니다.
  따라서 함수 호출과 관계없이 설정됩니다.
- 변수 초기화 단계는 함수를 호출했을 때 실행 콘텍스트를 만든 후의 처리이므로
  함수를 호출하지 않으면 변수 초기화 단계를 실행하지 않습니다.
  이때 [[scope]]를 외부 렉시컬 환경 참조에서 참조하도록 만듭니다.
 설명을 직관적으로 하기 위해 설정한다고 했지만, 설정은 복사 개념이 포함되어 있으므로 설정은 아니며 참조입니다.
 그래야 함수를 실행하는 중에 point 변숫값이 바뀌더라도 바뀐 값을 사용할 수 있습니다.