1. 스코프란?
스코프는 식별자가 유효한 범위를 말한다. 변수는 자신이 선언된 위치에 따라서 자신이 유효한 범위, 즉 다른 코드가 변수 자신을 참조할 수 있는 범위가 결정된다.
let a = 'jason'
function name() {
let a = 'tom'
console.log(a); // 1️⃣
}
name()
console.log(a); // 2️⃣
위에서 코드의 가장 바깥 부분과 name 함수 내부에서 동일한 변수 a를 선언하고 1️⃣과 2️⃣에서 a 변수를 참조한다.
이때 JS엔진은 이름이 같은 두개의 변수 중에서 어떤 변수를 참조할지 결정한다.
이를 식별자 결정이라고 한다. JS엔진은 스코프를 통해 어떤 변수를 참조해야 할지 결정한다.
따라서 스코프란 JS엔진이 식별자를 검색할 때 사용하는 규칙을 의미하기도 한다.
2. 스코프의 종류
3. 스코프 체인
함수 몸체 내부에서 함수가 정의된 것을 함수의 중첩이라고 함.
중첩 함수 : 함수 몸체 내부에서 정의한 함수
외부 함수 : 중첩 함수를 포함하는 함수
4. 함수 레벨 스코프
지역은 함수 몸체 내부를 말하고 지역은 지역 스코프를 만듦.
코드블록이 아닌, 함수에 의해서만 지역 스코프가 생성된다는 의미.
C나 자바 등을 비롯한 대부분의 프로그래밍언어는 함수 몸체만이 아니라 모든 코드 블록이 지역 스코프를 만든다.
이런 특성을 블록 레벨 스코프라고 한다.
5. 렉시컬 스코프
let x = 1;
function foo() {
let x = 10;
bar();
}
function bar() {
console.log(x);
}
foo();
bar();
위의 예제의 실행 결과는 bar함수의 상위 스코프가 무엇인지에 따라 결정된다.
1. 함수를 어디서 호출했는지에 따라 함수의 상위 스코프를 결정한다.
2. 함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정한다.
1번 방식을 동적 스코프라고 한다.
함수를 정의하는 시점에는 함수가 어디서 호출될지 알 수 없다. 따라서 함수가 호출되는 시점에 동적으로 상위 스코프를 결정해야 하기 때문에 동적 스코프라고 부른다.
2번 방식을 렉시컬 스코프 또는 정적 스코프라고 한다.
동적 스코프 방식처럼 상위 스코프가 동적으로 변하지 않고 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되기 때문에 정적 스코프라고 부른다.
JS를 비롯한 대부분의 프로그래밍 언어는 렉시컬 스코프를 따른다.
JS는 렉시컬 스코프를 따르므로 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다.
즉, 함수의 상위 스코프는 언제나 자신이 정의된 스코프이다.
'JS' 카테고리의 다른 글
[ JS 딥다이브 ] 12주차 : let, const 키워드와 블록레벨 스코프 (0) | 2023.05.06 |
---|---|
[ JS 딥다이브 ] 11주차 : 전역 변수의 문제점 (0) | 2023.04.23 |
[ JS 딥다이브 ] 9주차 : 함수 (0) | 2023.03.25 |
[ JS 딥다이브 ] 8주차 : 원시 값과 객체 비교 (0) | 2023.03.25 |
[ JS 딥다이브 ] 7주차 : 객체 리터럴 (0) | 2023.03.10 |