
유효 범위(Scope)는 변수나 함수에 접근할 수 있는 범위를 의미합니다. 스코프는 다음과 같은 중요한 역할을 합니다.
JavaScript의 스코프는 크게 전역 스코프와 지역 스코프로 나뉩니다.
코드의 가장 바깥 영역에 정의된 스코프입니다. 전역 스코프에서 선언된 변수를 전역 변수라고 하며, 코드 어디에서나 접근할 수 있습니다.
{}) 밖에서 선언된 변수는 전역 스코프를 가집니다.let globalVar = "전역 변수";
function showGlobal() {
console.log(globalVar); // 함수 내부에서도 전역 변수에 접근 가능
}
showGlobal(); // "전역 변수"
console.log(globalVar); // "전역 변수"
전역 변수를 무분별하게 사용하면 다음과 같은 문제가 발생할 수 있습니다.
let count = 0; // 전역 변수
function increaseCount() {
count++; // 의도치 않게 전역 변수의 상태를 변경
}
function resetCount() {
count = 0; // 다른 함수에서도 전역 변수를 변경
}
increaseCount();
console.log(count); // 1
resetCount();
console.log(count); // 0
특정 영역 내에서만 접근할 수 있는 스코프입니다. 지역 스코프에서 선언된 변수를 지역 변수라고 합니다.
함수 내부에서 선언된 변수는 함수 안에서만 유효합니다.
function myFunction() {
let functionVar = "함수 변수";
const functionConst = "함수 상수";
console.log(functionVar); // "함수 변수"
console.log(functionConst); // "함수 상수"
}
myFunction();
// 함수 밖에서는 접근 불가능
// console.log(functionVar); // ReferenceError: functionVar is not defined
// console.log(functionConst); // ReferenceError: functionConst is not defined
중괄호 {}로 감싸진 영역(if, for, while 등) 내에서만 유효한 스코프입니다.
if (true) {
let blockVar = "블록 변수";
console.log(blockVar); // "블록 변수"
}
// 블록 밖에서는 접근 불가능
// console.log(blockVar); // ReferenceError: blockVar is not defined
for (let i = 0; i < 3; i++) {
console.log(i); // 0, 1, 2
}
// 반복문이 끝난 후 i는 사라져 접근 불가능
// console.log(i); // ReferenceError: i is not defined
스코프 체인은 변수를 찾을 때 따르는 연쇄적인 검색 과정을 의미합니다.
JavaScript 엔진은 변수를 찾기 위해 현재 스코프에서 시작하여, 변수를 찾지 못하면 바로 바깥쪽(상위) 스코프로 이동하여 검색을 계속합니다. 이 과정은 전역 스코프에 도달할 때까지 반복됩니다.
ReferenceError가 발생합니다.let globalVar = "전역 변수"; // 전역 스코프
function outerFunction() {
let outerVar = "외부 함수 변수"; // outerFunction 스코프
function innerFunction() {
let innerVar = "내부 함수 변수"; // innerFunction 스코프
// 1. 현재 스코프에서 innerVar 검색 -> 찾음
console.log(innerVar); // "내부 함수 변수"
// 2. 현재 스코프에 outerVar 없음 -> 상위(outerFunction) 스코프에서 검색 -> 찾음
console.log(outerVar); // "외부 함수 변수"
// 3. 현재, 상위 스코프에 globalVar 없음 -> 최상위(전역) 스코프에서 검색 -> 찾음
console.log(globalVar); // "전역 변수"
}
innerFunction();
}
outerFunction();