스코프(Scope)는 “변수가 접근 가능하고 유효한 영역”을 의미한다. JavaScript 엔진이 특정 변수를 찾을 때, 어디까지 검색해야 하는지를 정의하는 규칙이라고 생각할 수 있다.
크게 전역 스코프와 지역 스코프가 있다.
varvar는 if문이나 for문 같은 블록({})을 무시하고, 오직 함수 레벨에서만 스코프를 형성function calculate() {
var a = 10; // 함수 스코프
if (true) {
var b = 20; // 여전히 함수 스코프 내부에 존재
console.log(b); // 20
}
console.log(b); // 20 (if 블록 밖이지만 함수 내이므로 접근 가능)
}
// console.log(a); // 에러: 함수 밖에서는 a에 접근 불가능
let, const{})로 묶인 코드 블록 내에서만 유효한 스코프. 함수, if문, for문, while문 등의 중괄호가 모두 블록 스코프를 만듦function checkScope() {
let c = 30; // 함수 스코프 겸 외부 블록 스코프
if (true) {
let d = 40; // if문 블록 스코프
console.log(c); // 30 (외부 스코프 접근 가능)
}
// console.log(d); // 에러: d는 if 블록 스코프 밖에서는 접근 불가능
}
JavaScript는 렉시컬 스코프(Lexical Scope) 규칙을 따른다. 이는 정적 스코프(Static Scope)라고도 불린다.
const globalVar = "전역 변수"; // 1. 전역 스코프
function outerFunction() {
const outerVar = "외부 함수 변수"; // 2. outerFunction 스코프
function innerFunction() {
const innerVar = "내부 함수 변수"; // 3. innerFunction 스코프
// 3번 스코프에서 2번, 1번 변수 모두 접근 가능
console.log(innerVar); // 접근 가능 (자신의 스코프)
console.log(outerVar); // 접근 가능 (바깥 스코프)
console.log(globalVar); // 접근 가능 (최상위 스코프)
}
innerFunction();
// console.log(innerVar); // 에러: 안쪽 스코프의 변수에는 접근 불가능
}
outerFunction();
let과 const를 사용해야 하는 이유let과 const가 제공하는 블록 스코프는 다음과 같은 이점을 제공
| 키워드 | 스코프 유형 | 장점 |
|---|---|---|
var |
함수 스코프 | 유연하지만, 스코프 범위가 넓어 예상치 못한 값 변경 및 충돌 위험이 높음. |
let, const |
블록 스코프 | 스코프 범위가 좁아 변수가 필요한 곳에서만 사용되어 변수 관리 용이성과 코드 안정성이 높아짐. |