작성
·
195
1
아직 몇 강 듣지 않았지만, 그냥 넘어가기는 찝찝해서 질문드립니다 ㅠ
제가 알기로는 ES5에서도 '스코프 체인'개념이 있는 것으로 알고 있는데요(아마 용어상의 혼선일 것이라 생각됩니다)
일단 제가 이해하고 있는 바(ES5기준)를 말씀드리겠습니다.
1.함수의 호출로 인해 해당 함수의 실행 컨텍스트가 활성화됩니다.
(===콜 스택에 해당 함수의 실행 컨텍스트가 쌓입니다)
2.엔진이 해당 함수의 스코프를 훓으면서 '렉시컬 환경'의 '환경 레코드'에 '선언된' 함수와 변수를 담습니다.
'선언된'함수와 변수를 담는 것이기에 할당 작업은 이 단계에서는 배제합니다.
때문에 함수 선언문은 함수 객체 자체가 전부 담기게 되고, 함수 표현식의 경우 변수명(식별자)만 담기게 됩니다.
3.'렉시컬 환경'의 '외부 환경 참조'에 '함수가 선언될 당시'의 렉시컬 환경을 참조시킵니다.
'함수가 선언될 당시'라는 건, 즉 이 함수를 선언했던 함수의 컨텍스트(만약 전역 컨텍스트에서 선언했다면 전역 컨텍스트)의 렉시컬 환경을 의미하는 것이죠?
4.이 함수를 호출한 주체를 this바인딩시킵니다(일반적으로)
만약 위의 설명에 틀린 부분이 없다고 한다면, 해당 함수의 스코프 안에서 식별자가 발견되지 않으면, '렉시컬 환경'의 '외부 환경 참조'를 타고 올라가서 식별자를 찾는 것이죠?
(제가 읽은 서적에서는 이를 '스코프 체인'으로 설명했습니다)
그렇다면 ES5에서의 스코프 체인도 결국 함수 호출로 인해 이루어지므로 '동적'으로 환경을 설정하는 것이 아닌가요?
또, 컨텍스트가 한 덩어리이기 때문에 한 메모리 안에서 찾아 검색이 빠르다고 말씀해주셨는데, 이렇게 '외부 환경 참조'를 타고 올라가는 것은 메모리의 다른 공간을 검색하는 일이 아닌지 궁금합니다 ㅠㅠ
답변 3
2
수준 높은 질문, 감사합니다.^^ 질문 내용을 강좌에서 모두 다루고 있습니다. 질문한 내용을 전부 답하려면 시간이 너무 걸리고, 질문 내용을 강좌에서 모두 다루므로 몆 가지만 작성하겠습니다.
1. 제가 알기로는 ES5에서도 '스코프 체인'개념이 있는 것으로 알고 있는데요(아마 용어상의 혼선일 것이라 생각됩니다) ==>
ES3에서 스코프 체인이라는 용어를 사용했습니다만, ES5에서 바꾸었습니다. ES5 스펙의 "Annex D의 13."을 보시기 바랍니다. 스코프 체인을 별도의 구조체로 생각해 볼 수도 있습니다.
2. 함수 표현식의 경우 변수명(식별자)만 담기게 됩니다. ==> 변수명과 변숫값으로 undefined를 담습니다.
3.'렉시컬 환경'의 '외부 환경 참조'에 '함수가 선언될 당시'의 렉시컬 환경을 참조시킵니다. '함수가 선언될 당시'라는 건, 즉 이 함수를 선언했던 함수의 컨텍스트(만약 전역 컨텍스트에서 선언했다면 전역 컨텍스트)의 렉시컬 환경을 의미하는 것이죠?
그렇다면 ES5에서의 스코프 체인도 결국 함수 호출로 인해 이루어지므로 '동적'으로 환경을 설정하는 것이 아닌가요?==>
엔진이 function 키워드를 만나면 Function 오브젝트를 생성합니다. 이때 생성하는 FO가 속한 스코프를 생성한 FO의 내부 프로퍼티인 [[scope]]에 설정합니다. 이때 스코프가 결정되며 바뀌지 않습니다. 그래서 정적 스코프입니다. 따라서 실행 중인 함수 안에 5개의 함수가 있을 때, 5개 함수의 스코프가 모두 같습니다.
함수가 호출되면 [[scope]]에 설정된 것을 외부 환경 참조에 설정합니다. 즉, 함수를 호출할 때 스코프를 결정하는 것이 아니라 Function 오브젝트를 만들 때 스코프가 결정됩니다.
0
0