렉시컬 스코프(Lexical Scope)
1. 렉시컬 스코프란?
렉시컬 스코프는 '코드가 작성된 위치(정적인 코드 구조)'를 기준으로 변수의 유효 범위(Scope)를 결정하는 방식이다.
함수가 어디서 호출됐는지가 아니라 어디에 정의됐는지를 기준으로 스코프가 정해짐.
JavaScript는 렉시컬 스코프 언어
JavaScript는 정적 스코프(Lexicla Scope)를 따른다.
즉, 함수가 정의될 당시의 코드 환경(스코프 체인)을 기억한다.
기본 렉시컬 스코프
const x = 1;
function outer() {
const x = 10;
function inner() {
console.log(x);
}
inner();
}
outer(); // 출력: 10
inner()는 outer() 내부에 정의되었기 때문에 outer의 스코프 체인에 접근함.
따라서 전역의 x(1)이 아니라 outer 내부의 x(10)을 참조함.
호출 위치와 상관없는 렉시컬 스코프
const x = 1;
function inner() {
console.log(x);
}
function outer() {
const x = 100;
inner(); // 호출 위치는 outer 내부
}
outer(); // 출력: 1
inner()는 전역에 정의되어 있으므로, 전역 스코프에 있는 x(1)를 참조함.
호출 위치는 outer() 내부지만, 정의된 위치가 더 중요.
특징 | 설명 |
정적(Lexical) | 실행 시점이 아닌 정의 시점에 스코프가 결정됨 |
중첩 가능 | 함수가 중첩되면 내부 함수는 외부 함수의 스코프에 접근 가능 |
상위 스코프 참조 | 내부 함수는 자신이 정의된 위치의 상위 스코프를 기억함 |
호출 위치 무관 | 함수가 어디서 호출되든 정의된 위치 기준으로 스코프 결정 |
2. 클로저와의 관계
렉시컬 스코프는 클로저(Closure) 개념과도 깊게 연결되어 있다.
내부 함수는 외부 함수가 종료된 이후에도, 자신이 정의된 렉시컬 환경을 계속 참조할 수 있다.
function outer() {
const secret = "비밀";
return function inner() {
console.log(secret);
};
}
const closureFunc = outer();
closureFunc(); // 출력: "비밀"
inner는 외부 함수인 outer의 렉시컬 환경을 기억.
outer()가 실행을 마친 이후에 변수 secret에 접근할 수 있음.
3. 결론
렉시컬 스코프는 JavaScript가 변수나 함수의 유효 범위를 어떻게 인식하고 관리하는지를 결정하는 중요한 규칙이다.
- '함수가 정의된 위치에서 스코프가 결정된다.'는 원칙을 확실히 이해할 필요가 있음.
'코딩 > 기초' 카테고리의 다른 글
[JavaScript] 키워드 this란? : 사용과 특성 (0) | 2025.05.01 |
---|---|
[JavaScript] var, let, const가 뭔데? : 변수 (2) | 2025.04.28 |
브라우저란? : Browser 동작 원리 (2) | 2025.04.25 |
시맨틱 태그란? : 이것은 원고지다 (0) | 2025.04.24 |
[CSS] Cascading이란? : 적용 순서 (0) | 2025.04.24 |