1. 스코프
모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)가 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위
즉, 식별자가 유효한 범위
var x = 'global';
function foo () {
var x = 'function scope';
console.log(x);
}
foo(); // ?
console.log(x); // ?
이때, 위의 출력값은 function scope 아래의 출력값은 global 으로 나타난다.
❓이유
자바스크립트 엔진은 식별자 결정(어떤 변수를 참조해야 할 것인지 결정)해야하는데, 스코프를 통해 어떤 변수를 참조해야 하는지 결정한다.
코드를 시랭 할 때 코드의 문맥을 고려하게되는데, 코드가 어디서 실행되며 어떤 코드가 있는 지에 따라 동일한 코드이지만 다른 결과를 만들어 낸다 !
즉, 스코프가 다른 별개의 변수라고 할 수 있음.
따라서 스코프란 자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙이라고 할 수 있다.
스코프라는 개념이 없다면 같은 변수는 충돌을 일으키므로 프로그램 전체에서 하나밖에 사용할 수 없다.
2. 스코프의 종류
변수 | 설명 | 스코프 |
전역변수 | 코드의 가장 바깥영역 | 전역 스코프 |
지역변수 | 함수 몸체 내부 | 지역 스코프 |

3. 스코프 체인
모든 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프이다. 이처럼 스코프가 계층적으로 연결된 것을 스코프 체인이라고 한다.
함수는 중첩이 가능하고 함수의 지역스코프도 중첩이 가능하다.
-> 스코프가 중첩에 의해 계층적 구조를 갖는다는 의미이다.
변수를 참조 할 때는 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.

상위 스코프에서 선언한 변수를 하위 스코프에서 참조할 수 있다.
❗️스코프가 만들어 지는 과정과 스코프체인에 대해
- 전역 실행 컨텍스트 생성
- 전역 실행 컨텍스트의 변수 x,y, 함수 outer가 바인딩 되어있는 스코프가 등록
- 평가 과정이 끝나 실행 과정이 시작
- 함수 outer를 만나 함수 outer에 대한 평가 과정과 실행 과정을 동작
- 함수 outer의 실행 컨텍스트 생성
- 함수 outer 실행 컨텍스트의 변수 z, 함수 inner가 바인딩 되어있는 스코프가 등록
- 함수 outer의 상위 스코프로 전역 실행 컨텍스트의 스코프가 등록
- .....
4. 함수 레벨 스코프
코드 블록이 아닌 함수에 의해서만 지역 스코프가 생성되는 특성을 블록 레벨 스코프라 하고, 함수의 코드 블록만 지역 스코프로 인정하는 것을 함수 레벨 스코프라 한다.
5. 렉시컬 스코프
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
상위 스코프를 결정하는 방법을 2가지로 나눌 수 있습니다.
- 함수를 어디서 호출했는지에 따라서 결정
- 함수를 어디서 정의했는지에 따라서 결정
1번의 경우 foo()는 10을 출력, bar()는 1를 출력할 것 입니다. 이러한 방식을 동적 스코프라고 합니다.
2번의 경우 foo(), bar()는 1를 출력할 것 입니다. 이런한 방식을 렉시컬 스코프(lexical scope) 또는 정적 스코프(static scope)라 합니다.
자바스크립트는 2번의 경우를 따릅니다. 즉, 자바스크립트는 렉시컬 스코프를 따르므로 함수를 어디서 정의했는지에 따라서 상위 스코프가 결정 됩니다.
렉시컬 스코프는 함수를 어디서 호출했는지가 아니라 어디서 정의했는지에 따라 상위 스코프를 결정하기 때문에, 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다.
'STUDY > 모던 자바스크립트 Deep Dive' 카테고리의 다른 글
[모던 자바스크립트 Deep Dive] 15장 let, const키워드와 블록 레벨 스코프 (0) | 2022.04.13 |
---|---|
[모던 자바스크립트 Deep Dive] 14장 전역 변수의 문제점 (0) | 2022.04.12 |
[모던 자바스크립트 Deep Dive] 10장 객체 리터럴 (0) | 2022.03.14 |
[모던 자바스크립트 Deep Dive] 09장 타입 변환과 단축 평가 (0) | 2022.03.11 |
[모던 자바스크립트 Deep Dive] 08장 제어문 (0) | 2022.03.11 |