작성
·
228
4
제가 제대로 이해하고 있는지 잘 모르겠지만 궁금한 부분이 있어 질문드립니다.
function book(){
var point = 123;
function get(){
log(point);
};
get();
};
book();
위의 예제에서 book함수가 호출되고 book함수 안으로 가서
제일 먼저 함수선언문인 get 함수의 function 오브젝트를 생성하는데 이때 get함수의 스코프가 설정된다고 하셨는데
하지만 이 시점에는 book함수 안의 변수들이 정의되기 전인데 어떻게 또는 어떤 정보들이 스코프에 설정 되는지가 궁금합니다.
답변 7
3
이제는 말할 수 있습니다만, 참조보다는 바인딩이 더 가깝습니다. 왜냐하면 바인딩은 정적 스코프가 포함되어 있기 때문입니다. get() Function 오브젝트를 생성할 때 스코프를 [[Scope]]에 바인딩한다는 것은, 이때 스코프가 결정된다는 뜻을 내포합니다. 즉, 스코프가 바뀌지 않는다는 것으로 get() 함수를 호출할 때마다 단지 가져다가 사용하면 된다는 것입니다. 이것을 정적 스코프라고 합니다.
반면 참조는 get() 함수를 호출할 때마다 참조하는 스코프가 바뀔 수 있다는 뉘앙스가 풍깁니다. 이것은 동적 스코프로 착각(오해)할 수도 있습니다. 이렇게 까칠하게(?) 짚을 필요는 없지만, 그래도 완전하게 표현하는 것이 나을 것 같습니다.
2
book() 함수를 호출하면 함수 안으로 이동합니다.
get() 함수 아래에 변수를 선언할 수 있으므로 get() 함수를 만나 Function Object를 생성할 때는 book() 함수 안에 작성한 변수들을 완전하게 알 수 없습니다. 따라서 get() 함수로 Function Object를 생성할 때 [[Scrope]]에 변수들을 설정할 수 없습니다.
이때 get() 함수가 속한 스코프를(만) 바인딩합니다. 즉, get() 함수가 속한 book() 함수의 어드레스를(만) 참조할 수 있도록 묶습니다. book() 함수 안의 변수/함수는 바뀔 수 있지만 바인딩한 book() 함수의 어드레스는 바뀌지 않습니다. 이것이 바인딩과 설정의 차이입니다. get() 함수 외부는 바인딩하고 내부는 설정합니다.
get() 함수를 호출하는 시점에는 book() 함수의 변수/함수가 [[Scope]에 설정되어 있으므로 [[Scope]]를 끌어오면 book() 함수 안에 작성된 함수/변수를 사용할 수 있습니다.
1
예, 뉘앙스에 차이가 있습니다. 바인딩은 사용전의 처리이고 참조는 사용 시점입니다. 예를 들어 this가 참조하는 오브젝트를 바인딩한다. 이것은 나중에 this가 참조하는 오브젝트를 사용하기 위해서이다. 이런 뉘앙스입니다.
1
1
0
0
네 제 질문은 get() 함수 밖의 환경 즉 book()함수 안의 변수들도 정의되기 전이기 때문에(함수선언문이 가장 먼저 실행되서) get() 함수의 외부 스코프가(외부 렉시컬 환경) 정의 될수 없지않을까라는 질문입니다!