본문으로 건너뛰기

scope

🧑🏻‍💻 scope (유효범위)


✅ scope란?

  • scope는 폴더와 같이 식별자가 유효한 범위를 말한다.

  • scope 내에서 식별자는 유일해야 하지만 다른 scope에는 같은 이름의 식별자를 사용할 수 있다. 이를 scope namespace 한다.

  • 이때 var는 스코프 내에서 중복 이름 선언이 가능하다.

  • 또한 var는 함수의 코드 블록만을 지역 scope로 인정한다.

  • 한편 let, const는 블록 레벨 scope를 지원한다.

// var는 같은 스코프 내에서 중복 이름 선언이 가능지만 부작용을 발생시킨다.
function foo() {
var x = 1;
var x = 2;
console.log(x); //2

let y = 1;
let y = 2; // SyntaxError
}

// var는 함수의 코드 블록만을 지역 scope로 인정한다.
var z = 1;

if(true) {
var x= 10;
}

console.log(x); // 10

✅ scope의 종류

구분설명스코프변수
전역코드의 가장 바깥 영역전역 스코프전역 변수
지역함수 몸체 내부지역 스코프지역 변수
  • 전역(지역)에서 선언된 변수는 전역(지역) scope를 갖는 전역(지역) 변수이다.

  • 전역이란 코드의 가장 바깥 영역을 말하고, 전역 변수는 어디서든지 참조할 수 있다.

  • 지역이란 함수 몸체 내부를 말하고, 지역 변수는 자신의 지역 scope와 하위 지역 scope에서 유효하다.

✅ scope chain과 식별자 검색 규칙

  • 함수는 중첩될 수 있으므로 함수의지역 scope도 중첩될 수 있다.

  • 이에 따라 scope가 함수의 중첩에 의해 계층적으로 연결된 것을 scope chain이라 한다.

  • 외부 함수의 지역 scope를 중첩 함수의 상위 scope라 부른다.

  • 변수를 참조할 때 JS 엔진은 scope chain을 통해 변수를 참조하는 코드의 scope에서 시작하여 상위 scope 방향으로 선언된 변수를 검색 한다.

  • 즉 상위 scope에서 선언한 변수를 하위 scope에서도 참조할 수 있다.

✅ lexical scope

  • JS는 lexical scope를 따르므로 함수를 어디서 ‘정의’ 했는지에 따라 상위 스코프를 결정한다.

  • 따라서 함수의 상위 스코프는 함수 정의가 실행될 때 정적으로 결정되고 상위 스코프를 기억한다.

  • 아래 코드는 1을 두 번 출력한다.

var x = 1;

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

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

foo(); // 1
bar(); // 1

참고 자료

  • 모던 자바스크립트 Deep Dive (사진 출처)