렉시컬 스코프(Lexical Scope)는 함수를 어디서 호출했는지가 아니라, 코드상에서 어디에 선언했는지에 따라 그 함수의 스코프(변수 유효 범위)가 결정되는 방식을 말한다. 코드를 작성할 때 스코프가 확정된다고 하여 정적 스코프(Static Scope)라고도 부른다.
let x = 1;
function foo() {
let x = 10;
bar(); // 여기서 호출됨
}
function bar() {
console.log(x); // 여기서 x는 무엇일까?
}
foo();
위 코드를 실행하면 10이 출력된다고 생각할 수 있지만 실제로는 1이 출력된다.
코드가 실행되는 순서를 살펴보면 왜 이런 결과가 나오는지 확인할 수 있다.
💡 코드 실행 순서
bar 함수는 foo 함수 내부에서 호출되었다. (동적 스코프라면 호출된 환경을 따라가서 10이 출력될 것이다.)bar 함수가 선언된 위치는 전역(Global)이다.bar 함수의 상위 스코프는 자신이 선언된 '전역 스코프'가 된다.bar 함수 내의 console.log(x)는 전역 변수 x의 값인 1을 참조하게 된다.