안녕하세요.
지난 포스팅에 이어서 모던 자바스크립트 Deep Dive 책을 바탕으로 스터디를 진행하면서 정리한 내용을 기술해보려합니다!
모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 변위가 결정된다.
이를 스코프라 한다.

- 전역이란 코드의 가장 바깥 영역을 의미한다.
- 전역은 전역 스코프를 만든다.
- 전역에 변수를 선언하면 전역 스코프를 갖는 전역 변수가 된다.
- 전역 변수는 어디서든지 참조할 수 있다.
- 지역이란 함수 몸체 내부를 말한다.
- 지역은 지역 스코프를 만든다.
- 지역에 변수를 선언하면 지역 스코프를 갖는 지역 변수가 된다.
- 지역 변수는 자신이 선언된 지역과 하위 지역(중첩 함수)에서만 참조할 수 있다.
- 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효한다.
모든 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프다.
이렇게 스코프가 계층적으로 연결된 것을 스코프 체인이라 한다.
상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있지만 하위 스코프에서 유효한 변수를 상위 스코프에서 참조할 수 없다
함수도 식별자에 해당되기 때문에 스코프를 갖는다.
따라서 스코프를 "변수에 검색할 때 사용하는 규칙" 이라고 표현하기 보다는 "식별자를 검색하는 규칙"이라고 표현하는 편이 좀 더 적합하다.
- 모든 코드 블록(if, for, while, try/catch)등 이 지역 스코프를 만든다.
- 이러한 특성을 블록 레벨 스코프라 한다.
- let, const, var 키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정한다.
- 이러한 특성은 함수 레벨 스코프라 한다.

JS는 렉시컬 스코프를 따르므로 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다.
함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다. 즉, 함수의 상위 스코프는 언제나 자신이 정의된 스코프다.이처럼 함수의 상위 스코프는 함수 정의가 실행될 때 정적으로 결정된다. 함수 정의(함수 선언문 또는 함수 표현식)가 실행되어 생성된 함수 객체는 이렇게 결정된 상위 스코프를 기억한다. 함수가 호출될 때마다 함수의 상위 스코프를 참조할 필요가 있기 때문이다
이상으로 스코프에 대한 포스팅을 마치도록 하겠습니다!