유효범위(scope, 스코프)

Yoo Jong Hyeon·2023년 5월 23일
0

Front-end & JS

목록 보기
5/8
post-thumbnail

자바스크립트에서 스코프(scope)란?

모든 식별자(변수 이름, 함수 이름, 클래스 이름 ...)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위(scope, 스코프)가 결정된다. 이를 스코프라 한다.

var x = `global`;

function myFunc(){
  var x = `local`;
  console.log(x);
}

myFunc(); // -> local
console.log(x); // -> global 

자바스크립트 엔진은 이름이 같은 두 개의 변수 중에서 어떤 변수를 참조해야 할 것인지를 결정(identifier resolution, 식별자 결정) 한다. 이 때 자바스크립트 엔진은 스코프(scope)를 통해 어떤 변수를 참조해야 할 지 결정한다. 즉 스코프란 자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙이라고도 할 수 있다.

여기서 식별자는 어떤 값(value)을 원자적(atomic)으로 구별할 수 있어야 하므로 유일(unique)해야 하며, 하나의 값은 하나의 식별자에 연결(name binding) 되어있다.


스코프의 종류

전역 스코프(global scope)

코드의 가장 바깥 영역에 선언된 변수는 전역 스코프(global scope)를 갖는다.

전역 스코프를 갖는 전역 변수(global variable)는 어디서든지 참조할 수 있다.

지역 스코프(local scope)

어떤 함수 몸체 내부에 선언된 변수는 지역 스코프(local scope)를 갖는다.

지역 스코프를 갖는 지역 변수(local variable)는 자신의 지역 스코프와 그 하위 지역 스코프에서만 유효하다.


스코프 체인(scope chain)

스코프(scope)가 계층적으로 연결된 것은 스코프 체인(scope chain)이라 한다.

모든 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프다.

상위 스코프에서 선언한 변수는 하위 스코프에서도 사용할 수 있는 이유는, 자바스크립트 엔진은 변수를 참조할 때 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색(identifier resolution)하기 때문이다.

스코프 체인은 물리적인 실체로 존재한다. 자바스크립트 엔진은 코드를 실행하기 전에 렉시컬 환경(lexical envionment)이란 자료구조를 실제로 생성한다.

렉시컬 환경은 어떤 변수가 선언될 때, 변수의 식별자를 키(key)로, 변수가 가리키는 실제 값을 값(value)으로 삼는 자료구조이다.


함수 레벨 스코프(function level scope)

C나 Java 등 대부분의 프로그래밍 언어는 함수의 몸체와 모든 코드 블록이 지역 스코프(local scope)를 만든다. 이런 특성을 블록 레벨 스코프(block level scope)라 한다.

자바스크립트에서 var 키워드로 선언된 변수는 함수의 코드 블록만을 지역 스코프로 만든다. 이런 특성을 함수 레벨 스코프(function level scope)라 한다.

var i = 0;

for(var i = 0; i < 5; i++){
  console.log(i); // -> 1 2 3 4
}

console.log(i); // -> 5;

자바스크립트에서 var 키워드로 선언된 변수는 오직 함수 레벨 스코프만을 지원한다. 따라서 for문 안의 i 변수는 전역 변수로 취급된다.


Reference

모던 자바스크립트 Deep Dive
이웅모 저 | 위키북스 | 2020년 09월 25일

0개의 댓글

관련 채용 정보