스코프란 무엇인가

Scope

MDN에서는 위와 같이 설명하고 있다. 쉽게 바꿔서 말하자면 현재 접근 할 수 있는 값과 표현식의 범위라고 이해하는게 좋을 것 같다. 즉, 지금 접근할 수 있는 값이나 식인 경우 스코프 범위 밖이구나 생각하면 된다.

전역 스코프

지역 스코프

function exampleFunction() {
    var x = "declared inside function";
    // x는 오직 exampleFunction 내부에서만 사용 가능.
    console.log("Inside function");
    console.log(x);
}

console.log(x);  // 에러 발생

예를 들어 위와 같은 상황은 유효하지 않다.

렉시컬 스코프

var x = 1;

function foo() {
  var x = 10;
  bar();
}

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

foo(); // ?
bar(); // ?

위의 예제의 결과는 무엇일까? 이 예제는 함수 bar의 상위 스코프가 무엇인지에 따라 결정된다.

첫번째는 함수를 어디서 호출하였는지에 따라 상위 스코프를 결정 한다.

두번째는 함수를 어디서 선언하였는지에 따라 상위 스코프를 결정하는 것이다.

첫번째 방식으로 함수의 상위 스코프를 결정한다면 함수 bar의 상위 스코프는 함수 foo와 전역일 것이고, 두번째 방식으로 함수의 스코프를 결정한다면 함수 bar의 스코프는 전역일 것이다.

프로그래밍 언어는 이 두가지 방식 중 하나의 방식으로 함수의 상위 스코프를 결정한다.

첫번째 방식을 동적 스코프(Dynamic scope)라 하고, 두번째 방식을 렉시컬 스코프(Lexical scope) 또는 정적 스코프(Static scope)라 한다.

자바스크립트를 비롯한 대부분의 프로그래밍 언어는 렉시컬 스코프를 따른다.

렉시컬 스코프는 함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정된다. 자바스크립트는 렉시컬 스코프를 따르므로 함수를 선언한 시점에 상위 스코프가 결정된다. 함수를 어디에서 호출하였는지는 스코프 결정에 아무런 의미를 주지 않는다.

즉 위 예제의 함수 bar는 전역에 선언되었다.

따라서 함수 bar의 상위 스코프는 전역 스코프이고 위 예제는 전역 변수 x의 값 1을 두번 출력한다.