[Javascript] Lexical Scope (렉시컬 스코프) 란?
✅ Lexcial Scope(= Static Scope) 란?
렉시컬 스코프, 또는 정적(static) 스코프는 프로그래밍 언어에서 변수의 유효 범위(scope)를 결정하는 규칙 중 하나이다. 함수 호출 시점과는 무관하게 변수 선언 위치에 따라 스코프가 결정되는 것을 말한다. 함수를 실행해 보지 않아도, 코드만 보고도 알 수 있는 것이 바로 렉시컬 스코프이다.
✅ Lexical Scope의 예시
function outerFunction() {
const outerVar = "I am from outerFunction";
function innerFunction() {
console.log(outerVar);
}
return innerFunction;
}
const myClosure = outerFunction(); // outerFunction을 호출하면 innerFunction이 반환됩니다.
myClosure(); // myClosure를 호출하면 "I am from outerFunction"이 출력됩니다.
innerFunction()
에 지역 변수가 선언되어 있지 않지만, 부모함수outerFunction()
에 선언되어 있는 변수outerVar
에 접근할 수 있다.- 그 변수가 어디에 선언되어 있는지에 따라 스코프가 변하지 않는 것을 의미한다.
- Javascript 말고도 다른 여러 언어에서 거의 대부분 렉시컬 스코프를 사용한다.
렉시컬 스코프, 즉 정적 스코프에 대해 반대되는 개념은 Dynamic Scope(동적 스코프)라고 할 수 있는데, 그 예시는 다음과 같다.
✅ Dynamic Scope
변수의 유효 범휘가 호출 스택에 따라 동적으로 결정되는 것을 말한다. 예시는 아래와 같다.
function outerFunction() {
const outerVar = "I am from outerFunction";
middleFunction();
}
function middleFunction() {
console.log(outerVar); // outerVar를 참조하는 것은 동적 스코프 규칙을 따를 때 가능할 것입니다.
}
outerFunction();
middleFunction()
은outerFunction()
안에서 호출되었다.- 이 언어가 동적 스코프를 따른다면,
middleFunction()
에서outerVar
를 참조할 수 있게 된다.
하지만 이렇게 되면 변수의 유효범위를 개발자가 알기 어렵기 때문에, Javascript를 포함한 대부분의 언어에서는 렉시컬스코프를 사용한다. 동적 스코프를 사용하는 언어로는 Lisp, Bash(스크립트), Perl 등이 있다고 한다.