인프런 커뮤니티 질문&답변

kimyongin님의 프로필 이미지

작성한 질문수

자바스크립트 중고급: 엔진 핵심

6. Lexical Environment, var 키워드 문제와 해결, 동적 환경

use strict 없을때는 어떻게 동작하나요?

작성

·

240

0

use strict 없이 var 사용하지 않고 변수 선언하면 identifier resolution은 ES3의 scope chain 방식으로 동작하게 되는건가요?

앞에서 execution context 구조 설명하실때 TBC 에 대해서 나왔는데, TBC에 글로벌오브젝트가 바인딩 되어 있으니까 TBC를 통해서 resolution을 하게 되나요? 그런데 따로 bind 설정을 해버리면 TBC를 이용하는건 안될것 같긴 한데요.

답변 4

2

김영보님의 프로필 이미지
김영보
지식공유자

첨언하면 이러한 스코프 설정을 Function 오브젝트를 생성할 때 한 번만 한다는 것입니다. 대부분 스코프가 같은데 함수를 호출할 때마다 매번 스코프를 만들면 처리 속도가 떨어집니다.

2

김영보님의 프로필 이미지
김영보
지식공유자

짐작하신 것과 비슷하며, 뒤에서 다룹니다. ES5에서는 기본적으로 scope chain이 아닌 정적 환경을 취합니다. 정적 환경도 scope chain과 구조적으로는 같은 개념입니다만 scope가 다릅니다. 정적 환경은 함수의 직계 라인에 속한 것만 스코프를 가져가려는 개념이고 scope chain은 모든 함수의 변수를 전부 하나의 오브젝트에 넣어 사용하는 개념입니다. 소스 파일에 500개 함수가 있다고 할 때, 모든 함수에서 선언한 변수를 하나의 오브젝트에 넣어 처리하려는 것이 scope chain 접근입니다. 따라서 무겁기도 하고 식별자 해결에도 시간이 걸릴 것입니다. 특히 다수 사용자의 요청을 처리해야 하는 Node.js와 때로는 몇 시간씩 실행하는 머신러닝/립러닝에서는 크게 차이가 나며 문제가 생길 수도 있습니다. 

0

kimyongin님의 프로필 이미지
kimyongin
질문자

답변 감사합니다.

위 답변에서 "동적으로 식별자를 해결" 이라고 하셨는데, scope chain 이 동적으로 동작 하는 것이기도 하거니와, 2분37초에 "scope chain 개념으로 가버려야 되잖아요?" 라고 말씀 하시는걸 봐서는 scope chain 으로 동작하는게 맞는것 같은데, 위 답변에서 scope chain 이라고 명확하게 답변을 안해주신걸 봐서는 어떤 이유가 있으신거죠?

질문을 하면서 자답을 해보자면,  ES5 스펙에 "10.2.3 The Global Envrioment"가 있는데 해당 부분에서 위 내용을 다루게 되는걸까요? 동적으로 처리하긴 하는데 어쨋든 스펙상 용어가 scope chain은 아닌거군요?

0

김영보님의 프로필 이미지
김영보
지식공유자

글로벌 변수가 됩니다. 함수 안의 변수로 정의되지 않으므로 정적이 아닌 동적이 됩니다. 그래서 별도의 구조(오브젝트)를 가져간 것입니다. 그 오브젝트에서는 이런 것을 반영해서 동적으로 식별자 해결을 하려는 의도입니다.