스코프 = 유효범위
스코프
- 스코프란, 변수나 함수, 클래스 등이 참조될 수 있는 범위를 말한다. 모든 식별자 (변수 이름, 함수 이름, 클래스 이름 등)는 선언된 위치에 의해 그 식별자를 참조할 수 있는 유효범위가 정해진다.
스코프의 종류
- 전역 스코프
- 선언된 위치가 전역일 경우 (전역 변수) 자신이 유효한 범위는 전역 스코프다.
- 전역은 코드의 가장 바깥 영역을 말한다.
- 전역 변수는 어디서든지 참조할 수 있다.
- 지역 스코프
- 선언된 위치가 함수 몸체 내부 (지역) 일 경우 (지역 변수) 자신이 유효한 범위는 지역 스코프다.
- 지역은 함수 몸체 내부를 말한다.
- 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 참조할 수 있다.
스코프 체인
- 모든 스코프는 하나의 계층적 구조로 연결된다. 이걸 스코프 체인이라고 한다.
- 상위 스코프 변수는 모든 하위 스코프 변수에서 사용할 수 있다. 즉 변수를 참조할 때 자바스크립트 엔진은 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.
- 스코프 체인은 물리적인 실체 (=스코프 체인)로 존재한다. 자바스크립트 엔진은 코드를 실행하기 전에 렉시컬 환경을 실제로 생성한다. 변수를 선언한다는 것은 결국 이 렉시컬 환경에 해당 변수 식별자를 키로 등록한다는 것이고, 변수에 값을 할당하는 것은 이에 해당하는 값을 변경한다는 것이다. 변수 검색도 역시 이 렉시컬 환경 자료구조 위에서 일어난다.
함수 레벨 스코프
- 대부분의 프로그래밍 언어는 함수 뿐만 아니라 코드 블록이 지역 스코프를 만든다.
- 하지만 자바스크립트 var 변수 선언은 오로지 함수 단위로 지역 스코프를 만든다.
- ES6에서 도입된 let, const 키워드는 블록 레벨 스코프를 지원한다.
렉시컬 스코프
- 렉시컬 스코프는 함수를 정의할 때 상위 스코프가 정해지는 것을 말한다.
- cf) 동적 스코프는 함수를 호출할 때 상위 스코프가 결정된다.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x); // x는 1 (호출되어도 동일하게 1을 가리킴)
}
foo(); // 1
bar(); // 1
렉시컬 환경, 컨텍스트, 실행 컨텍스트?