• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

클로저 질문입니다.

20.03.30 17:24 작성 조회수 173

2

getPoint 오브젝트에서 point 변수는 외부 렉시컬 환경 참조에서 찾을 수 있지만 bookParam은 어떻게 찾나요?
bookParam도 같이 외부 렉시컬 환경 참조에 바인딩 되나요? 

bookParam은 book 실행 콘텍스트의 선언적 환경 레코드에 있는데 이걸 어떻게 가져다 쓸수 있는건가요?

답변 3

·

답변을 작성해보세요.

3

book 오브젝트의 외부 렉시컬 참조에 설정 되어있는 것도 getPoint 오브젝트의 외부 렉시컬 참조에 설정하나요? ==> 맞습니다. 다만 설명을 위해서 설정이라고 했습니다만, 참조입니다. 

위코드를 실행해보니 book 오브젝트의 외부 렉시컬 참조에 설정된 value를 사용할 수 있었습니다. ==>
맞습니다. 계층적으로 밖에 있는 스코프를 참조합니다. 우선 1단계 밖에 있는 프로퍼티를 찾고, 거기에 없으면 다시 2단계 밖에 있는 프로퍼티를 찾습니다(식별자 해결). 그래도 없으면 같은 방법으로 글로벌 오브젝트까지 올라가서 프로퍼티를 찾습니다.

그러면 실행 콘텍스트 하나가 하나의 스코프로 묶여있는 개념으로 알고 있으면 될까요? ==> 
실행 콘텍스트는 함수를 실행하는 단위이며, 스코프 개념과는 거리가 있습니다. 스코프를 갖고 있는 것은 Function 오브젝트입니다. Function 오브젝트 단위로 스코프가 묶여 있다고 할 수 있습니다. function 키워드를 만난 시점에 Function 오브젝트를 생성하게 되고 이때 자신이 속한 스코프를 [[scope]]에 바인딩합니다. 바인딩을 묶는다는 개념으로 사용할 수 있습니다.

0

I.m yong님의 프로필

I.m yong

질문자

2020.03.30

답변 감사합니다. 궁금한게 하나 더 있습니다.

선언적 레코드에 설정된 것이 getPoint Function 오브젝트의 [[scope]]에 설정되며... ==> book 오브젝트의 외부 렉시컬 참조에 설정 되어있는 것도 getPoint 오브젝트의 외부 렉시컬 참조에 설정하나요? 위코드를 실행해보니 book 오브젝트의 외부 렉시컬 참조에 설정된 value를 사용할 수 있었습니다. 그러면 실행 콘텍스트 하나가 하나의 스코프로 묶여있는 개념으로 알고 있으면 될까요?

0

bookParam도 같이 외부 렉시컬 환경 참조에 바인딩 되나요?  ==> 맞습니다.
book() 함수가 호출되면 실행 콘텍스트, 선언적 환경 레코드를 만듭니다. 그리고 우선 bookParam을 선언적 환경 레코드에 설정합니다. 그런 후 point 변수를 바인딩합니다. 즉, 파라미터, 함수 선언문, 변수 순서로 선언적 환경 레코드에 바인딩(설정)합니다. 따라서 파라미터 이름과 함수 선언문의 이름이 같으면 파라미터 값이 Function 오브젝트로 대체됩니다. 이것은 설정입니다. 한편 변수 이름을 바인딩할 때는 undefined를 파라미터 값에 설정하지 않지만, 실행 단계에서는 100을 설정합니다. 강좌 뒷 부분에서 이에 대한 설명이 나옵니다. 

bookParam은 book 실행 콘텍스트의 선언적 환경 레코드에 있는데 이걸 어떻게 가져다 쓸수 있는건가요? =>
선언적 레코드에 설정된 것이 getPoint Function 오브젝트의 [[scope]]에 설정되며 getPoint() 함수가 호출되면 [[scope]]를 외부 렉시컬 참조에 설정하므로 getPoint() 함수에서 bookParam을 사용할 수 있습니다.