• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

this, [[Scope]] 관련 질문 입니다.

20.10.05 15:33 작성 조회수 134

0

안녕하세요.

ES5를 공부하다보니 어느 새 ES6로 넘어왔습니다.

다름이 아니라 갑자기 문득 이해가 안되는 부분이 있어 질문을 하게 되었습니다.

Function Book() {...} 이라는 함수가 있고 이걸 호출하면 Book이 속해있는 scope를 내부 property인 [[Scope]]에 참조하는 것으로 알고 있습니다. 

그러면 여기서 ThisBindComponent도 같은 타이밍에 결정이 되는건가요?

즉, 아래처럼 new 연산자로 Book의 객체를 만들면

let obj = new Book();

[[Scope]]와 ThisBindComponent는 같은 곳을 가리키는 걸까요?

답변 주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

1

Function Book() {...} 이라는 함수가 있고 이걸 호출하면 Book이 속해있는 scope를 내부 property인 [[Scope]]에 참조하는 것으로 알고 있습니다. 
==> 맞습니다만, 뉘앙스에서 약간 차이가 있습니다.
이걸 호출하면 Book이 속해있는 scope를 내부 property인 [[Scope]]에 참조하는 것
==> 호출하는 시점이 아니라 엔진이 function book()을 만나면 Function 오브젝트(객체)를 생성(호출하는 것이 아닙니다)합니다. 이때 Function 오브젝트의 내부 프로퍼티인 [[Scope]]에 book() 함수가 속한 스코프를 참조하도록 설정합니다. 호출할 때 설정하면 동적 스코프가 되고 function 오브젝트를 생성하는 시점에 설정하면 정적 스코프가 됩니다. 사례는 정적 스코프입니다.

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

그러면 여기서 ThisBindComponent도 같은 타이밍에 결정이 되는건가요?
==> ABC.book() 형태로 함수를 호출하면 함수가 실행되는 실행 콘텍스트를 만듭니다. 
ThisBindComponent는 실행 콘텍스트 안에 존재합니다. 따라서 함수를 호출해야 만들어 집니다. 그리고 book() 함수 앞에 작성한 ABC 오브젝트를 참조하도록 바인딩시킵니다. ABC 오브젝트의 프로퍼티는 this.property_name 형태로 악세스 합니다.
[[scope]]는 실행 콘텍스트의
외부 렉시컬 환경 참조에 설정됩니다. 따라서 함수가 속한 스코프의 변수를 마치 함수 안에 작성한 것처럼 사용할 수 있습니다. 이것이 클로저입니다.