렉시컬 스코프

렉시컬 스코프(Lexical Scope)는 함수가 선언된 위치에 따라 상위 스코프가 결정되는 방식입니다.

핵심 개념

const x = 10;

function outer() {
    const x = 20;

    function inner() {
        console.log(x);  // 어떤 x를 참조할까?
    }

    return inner;
}

const fn = outer();
fn();  // 20 출력

inner 함수는 선언된 위치(outer 내부)를 기준으로 스코프를 결정합니다.

렉시컬 스코프 vs 동적 스코프

구분스코프 결정 시점기준
렉시컬 스코프함수 선언 시어디서 선언했는가
동적 스코프함수 호출 시어디서 호출했는가
const x = 10;

function foo() {
    console.log(x);
}

function bar() {
    const x = 20;
    foo();  // 렉시컬: 10 / 동적: 20
}

bar();  // JavaScript는 렉시컬 스코프 → 10 출력

스코프 체인

렉시컬 스코프는 스코프 체인을 형성합니다.

const a = 1;  // 전역 스코프

function outer() {
    const b = 2;  // outer 스코프

    function inner() {
        const c = 3;  // inner 스코프
        console.log(a, b, c);  // 1, 2, 3
    }

    inner();
}

outer();
inner 스코프 (c)
    ↓ 없으면 상위로
outer 스코프 (b)
    ↓ 없으면 상위로
전역 스코프 (a)

클로저와의 관계

렉시컬 스코프 덕분에 클로저가 가능합니다.

function createCounter() {
    let count = 0;  // 렉시컬 환경에 저장

    return function() {
        return ++count;  // 선언 당시의 count를 기억
    };
}

const counter = createCounter();
counter();  // 1
counter();  // 2
counter();  // 3

createCounter 실행이 끝나도, 반환된 함수는 선언 시점의 렉시컬 환경(count 변수)을 계속 참조합니다.

요약

항목설명
정의함수 선언 위치 기준으로 스코프 결정
특징코드 작성 시점에 스코프가 확정됨 (정적)
장점코드만 보고 스코프 예측 가능
활용클로저, 모듈 패턴 등

CSLOG에서 보기