프로그래밍 언어/JavaScript
[자바스크립트 필기] #8 - 스코프
SpaceCowboy
2021. 7. 31. 22:26
*이 필기는 웹 프로그래밍 튜토리얼에서 보고 작성합니다.
1. 스코프란?
우리는 이를 함수에서 경험하였는데 함수의 매개변수는 함수 몸체 내부에서만 사용할 수 있고 외부에서는 사용할 수 없다. 따라서 함수 매개변수의 스코프는 함수 몸체로 제한된 것이다.
변수 이름을 비롯한 모든 식별자는 선언된 위치에 따라서 식별자를 참조할 수 있는 유효 범위가 결정되는데 이를 스코프라고 한다.
2. 스코프의 종류
구분 | 설명 | 스코프 | 변수 |
전역 | 코드의 가장 바깥 영역 | 전역 스코프 | 전역 변수 |
지역 | 함수 몸체 내부 | 지역 스코프 | 지역 변수 |
- 전역 변수는 어디서든지 참조할 수 있다.
- 지역 변수는 자신의 지역 스코프와 하위 지역 스코프에서 유효하다.
3. 스코프 체인
함수는 중첩될 수 있으므로, 지역 스코프 또한 중첩될 수 있다. 따라서 스코프는 함수의 중첩에 의해 '계층적 구조'를 갖는다. 그리고 이러한 계층적 구조를 가진 스코프를 스코프 체인이라고 한다.
변수를 참조할 때 이를 해석하는 엔진은 스코프 체인을 통해서 변수를 참조하는 코드에서 시작해서 바깥쪽으로 나가면서 선언된 변수를 찾는다.
4. 함수 레벨 스코프 vs 블록 레벨 스코프
- 함수 레벨 스코프 : 함수에 의해서'만' 지역 스코프가 생성됨
- 블록 레벨 스코프 : 함수 몸체뿐만 아니라 모든 코드 블록(if, for, while, ...)이 지역 스코프를 만듦
*자바스크립트 var 키워드로 선언된 변수는 only 함수 레벨 스코프만 지원한다. *
*반면에 let, const 키워드는 블록 레벨 스코프를 지원한다.*
5. 동적 스코프 vs 렉시컬 스코프
아래 코드에서 과연 어떤 결과가 나올지 조금만 생각해보자.
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // ?
bar(); // ?
이 결과는 bar 함수의 상위 스코프가 뭔지에 따라 결정된다. 2가지 방법으로 결정된다고 한다.
- 함수를 어디서 '호출'했는지에 따라 상위 스코프 결정 -> 동적 스코프
- 함수를 어디서 '정의'했는지에 따라 상위 스코프 결정 -> 렉시컬 스코프
자바스크립트를 비롯한 대부분의 프로그래밍 언어는 렉시컬 스코프를 채택했다.
여기까지 입니다 - 틀린 점이 있다면 꼭 지적해주세요!