실행컨텍스트와 this 복습하기 전에 스코프에 대해서 한번 정리해보자!
1. 스코프
- 식별자가 유효한 범위
- 자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙
- 스코프는 네임스페이스, 프로그래밍 언어에서는 스코프 통해 식별자인 변수 이름의 충돌 방지하여 같은 이름의 변수를 사용할 수 있게 한다.
- 스코프 내에서 식별자는 유일해야 하지만 다른 스코프에는 같은 이름의 식별자를 사용할 수 있다.
1-1. 스코프 종류
구분 | 설명 | 스코프 | 변수 | 참조영역 |
---|
전역 | 코드의 가장 바깥 영역 | 전역 스코프 | 전역 변수 | 어디서든 참조 가능 |
지역 | 함수 몸체 내부 | 지역 스코프 | 지역 변수 | 자신의 지역 스코프와 하위 지역 스코프에서 유효 |
1-2. 스코프 체인
- 스코프가 계층적으로 연결된 것
- 변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.
- 이를 통해 상위 스코프에서 선언한 변수를 하위 스코프에서도 참조할 수 있다.
- 함수는 중첩될 수 있으므로 함수의 지역 스코프도 중첩될 수 있다.
- 스코프가 함수의 중첩에 의해 계층적 구조를 갖는다는 것을 의미
- 중첩 함수의 지역 스코프는 중첩 함수를 포함하는 외부 함수의 지역 스코프와 계층적 구조를 갖는다.
- 이때 외부 함수의 지역 스코프를 중첩 함수의 상위 스코프라고 한다.
- 모든 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프다.
1-3. 스코프 체인에 의한 함수 검색
- 함수 선언문으로 함수를 정의하면 런타임 이전에 함수 객체가 먼저 생성된다.
- 자바스크립트 엔진은 함수 이름과 동일한 이름의 식별자를 암묵적으로 선언, 생성된 함수 객체를 할당한다.
- 스코프는 변수를 검색할때 사용하는 규칙이 아닌 식별자를 검색하는 규칙!
1-4. 함수 레벨 스코프,블록 레벨 스코프
블록 레벨 스코프
- 코드 블록(if, for, while, ...)이 지역 스코프를 만든다.
함수 레벨 스코프
1-5. 렉시컬 스코프
코드가 어디서 실행되며 주변에 어떤 코드가 있는지를 렉시컬 환경이라 부른다.
이를 구현한 것이 실행 컨텍스트, 모든 코드는 실행 컨텍스트에서 평가되고 실행된다.
- 스코프 체인은 실행 컨텍스트의 렉시컬 환경을 단방향으로 연결(체이닝)한 것
- 전역 렉시컬 환경은 코드가 로드되면 곧바로 생성되고 함수의 렉시컬 환경은 함수가 호출되면 곧바로 생성된다.
1-6. 동적 스코프 vs 렉시컬(정적) 스코프
| 동적 스코프 | 렉시컬(정적) 스코프 |
---|
스코프 결정 시점 | 함수 호출될때 | 함수 정의될때 |
- 자바스크립트는 렉시컬 스코프를 따름
- 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다.
- 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다
- 함수의 상위 스코프는 언제나 자신이 정의된 스코프다.
참고자료: 모던 자바스크립트 deep dive - 이웅모 저