✅ 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 등이 있다고 한다.