• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

정적 환경의 스코프 설정에 대해서

20.04.14 17:28 작성 조회수 136

1

앞선 강의('함수 코드 해석 순서' 편 이전의 강의)에서 스코프는 함수가 선언됬을 때 외, 내부 스코프를 설정 한 후 콘텍스로 저장한다고 이해했습니다.

그런데 이번 강의을 들으면서 스코프가 함수가 호출이 됬을 때 엔진이 함수 안을 해석하면서 스코프를 설정한다고 생각하게 되었습니다. 

저는 저번 강의에서 함수 정의 단계에서 설정된 콘텍스(전에 설정된 스코프 덩어리)가 함수가 호출 되었을 때 식별가 해결에 사용된다고 받아들였습니다.

어떤 스코프가 맞는 건가요?

답변 4

·

답변을 작성해보세요.

2

주유찬님의 프로필

주유찬

질문자

2020.04.14

감사합니다

2

이해가 되셨으니 정확한 이해를 위해 문장을 다듬어 보겠습니다.

우선 함수가 정의 되었을때 자신이 속한 함수(or 없다면 글로벌)를 외부 스코프로 설정하고 이때 내부는 해석하지 않는다. 
==> 엔진이 코드를 해석하면서 function 키워드를 만나면(만났을 때) 자신이 속한 함수(or 없다면 글로벌)를 스코프(외부 스코프라는 용어는 사용하지 않으며 스코프가 외부 스코프를 가리킵니다)를 생성하는 Function 오브젝트의 [[Scope]]에 설정하며, 이때 함수 내부는 해석하지 않는다.

이후 함수가 호출될 때 엔진이  함수 내부를 읽으면서 단계를 걸쳐 함수와 변수를 네임벨류 형식으로 저장합니다. 
==> 이후 함수가 호출될 때(호출되면) 엔진이  함수 내부를 읽으면서 단계를 걸쳐 함수와 변수를 네임벨류 형식으로 (실행 콘텍스트에)저장합니다.

이 때 바인딩된 스코프는 함수 안에 작성된 외부 변수를 식별하는 데 사용합니다. 이후 저장한 데이터가 하나의 콘텍스트로 지정되며 이후 함수가 불릴 때마다 식별자 해결을 위해 사용된다.
==> 
이 때 바인딩된 스코프는 함수 안에 작성된 외부 변수를 식별하는 데 사용합니다. 이후 저장한 데이터가 하나의 콘텍스트로 지정되며(콘텍스트 안에 작성되며) 이후 함수가 불릴 때마다(변수 사용도 포함) 식별자 해결을 위해 사용된다. 

그렇다면 스코프란 자기 자신을 포함한 영역이며
==> 그렇다면 스코프란 자기 자신을 포함한 영역(ES5는 함수, ES6+는 함수와 블록)을 뜻합니다. 글로벌 오브젝트도 스코프이지만, 이에 대해서는 뒤에서 다룹니다). 함수의 1레벨 밖의 영역을 스코프라고 하지만, 앞뒤 문맥에 따라 함수 안도 스코프라고 하는 경우도 있습니다. 예를들면 스코프에서 변수를 식별한다고 하면, 이것은 함수 안과 밖을 모두 지칭합니다.

함수 안에 작성된 코드는 함수 호출 이후 식별과 해석이 되는 건가요? 
==> 예, 맞습니다. 함수 안에 작성된 코드(함수 선언문, 함수 표현식, 변수)를 단계적으로 해석(하여 실행 콘텍스트에 설정)합니다. 식별을 조금더 명확하게 정리하면 식별은 해석하는 단계보다 코드를 실행할 때 사용한다고 할 수 있습니다. 변수에 값을 할당하면, 즉 실행할 때 변수 이름을 식별하므로 실행할 때가 개념적으로 어울립니다.

2

앞선 강의('함수 코드 해석 순서' 편 이전의 강의)에서 스코프는 함수가 선언됬을 때 외, 내부 스코프를 설정 한 후 콘텍스로 저장한다고 이해했습니다.

==> 이 문장을 정리해보겠습니다. 엔진이 function 키워드를 만나 Function 오브젝트를 생성할 때, 자신이 속한 스코프를 생성한 Function 오브젝트의 [[Scope]]에 설정합니다. 이때 함수 내부는 해석하지 않습니다. 실행 콘텍스트는 호출된 함수 기준입니다. 따라서 함수 안에 작성된 함수의 스코프는 이때 결정되며 바뀌지 않습니다.

그런데 이번 강의을 들으면서 스코프가 함수가 호출이 됬을 때 엔진이 함수 안을 해석하면서 스코프를 설정한다고 생각하게 되었습니다. 

==> 함수가 호출되면 실행 콘텍스트를 생성하며, 실행 콘텍스트에서 호출된 함수의 [[Scope]]에 바인딩된 것을 호출된 함수의 1레벨 밖의 스코프로 사용합니다. 1레벨 밖이라고 한 것은 호출된 함수 안을 스코프로 볼 수도 있기 때문입니다. 

저는 저번 강의에서 함수 정의 단계에서 설정된 콘텍스(전에 설정된 스코프 덩어리)가 함수가 호출 되었을 때 식별가 해결에 사용된다고 받아들였습니다.

==> 앞에 답글로 작성한 내용을 이해하면 위의 질문에 대해서 정리가 될 것 같습니다.

1

주유찬님의 프로필

주유찬

질문자

2020.04.14

답글을 달아주신 것에 대해 감사드립니다.

하지만 아직 이해가 덜한 부분이 있어 이렇게 답글을 남깁니다.

우선 첫번째 답변은 제가 스코프에 대해 이해하는 데 큰 도움이 되었습니다.  

제가 이해한 바를 적어보면

우선 함수가 정의 되었을때 자신이 속한 함수(or 없다면 글로벌)을 외부 스코프로 설정하고 이때 내부는 해석하지 않는다. 이후 함수가 호출될 때 엔진이  함수 내부를 읽으면서 단계를 걸쳐 함수와 변수를 네임벨류 형식으로 저장합니다.  이 때 바인딩 된 스코프는 함수 안에 작성된 외부 변수를 식별하는 데 사용합니다. 이후 저장한 데이터가 하나의 콘텍스트로 지정되며 이후 함수가 불릴 때마다 식별자 해결을 위해 사용된다.

이렇게 표현됩니다. 

여기서 궁금한 점이 있습니다.

그렇다면 스코프란 자기 자신을 포함한 영역이며 함수 안에 작성된 코드는 함수 호출 이후 식별과 해석이 되는 건가요?

2번째 질문은 이해가 잘 되지 않아서 이렇게 답글을 남깁니다.