자바스크립트는 함수를 어디서 호출했는지가 아니라 함수를 정의했는지에 따라 상위 스코프를 결정합니다. 즉 함수의 상위 스코프는 자신이 정의된 스코프
입니다.
예시를 살펴 보겠습니다.
var x = 1;
fuction foo(){
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // x = 1;
bar(); // x = 1;
함수 bar()를 실행하면, 전역 스코프에 선언된 var = 1;
를 참조한다는 것을 알 수 있습니다.
하지만, foo()를 실행하면 foo()함수 스코프 내부에 선언된 var = 10;
을 참조하는 것이 아닌 실제 bar()가 선언된 스코프
, 즉 전역 스코프
에서 선언된 var = 1
를 참조하는 것을 확인 할 수 있습니다.
위와 같이, 자바스크립트에서는 상위 스코프는 함수정의가 실행 될때 정적으로 결정되며, 함수 정의(함수 선언문 또는 함수 표현식)이 실행되어 생성된 함수는 상위 스코프를 기억합니다.
이러한 방식을 렉시컬 스코프(lexical scope) 또는 정적 스코프(static scope)라고 합니다.자바스크립트
를 비롯한 C, Java, Python
등의 프로그래밍 언어가 렉시컬 스코프를 따릅니다.