모던 자바스크립트

Ch.13 스코프

김민규(cobocho) 2022. 10. 10. 01:40

스코프(유효범위)는 자바스크립트를 포함한 모든 프로그래밍 언어에의 기본적이며 중요한 개념이다.

 

function add(x,y) {
	console.log(x,y); // 2 5
    return x + y;
}

add(2,5); // 7

console.log(x,y); // 참조에러

변수는 전역이나 블록 혹은 함수 몸체 내부에서도 선언할수 있다.

 

var x = 'global';

function foo() {
	var x ='local';
	console.log(x);
}

foo();  // 'local'

console.log(x); // 'global'

 

 

var x 를 함수 내부와 전역에서 중복으로 선언시 자바스크립트 엔진은 이름이 같은 변수 중에서 식별자 결정을 통해 참조한다.

 

따라서 스코프란 자바스크립트 엔진이 식별자를 검색할 때 사용하는 규칙이라고도 할 수 있다.

 

스코프의 종류

스코프는 전역스코프와 지역스코프로 구분할 수 있다.

전역 변수는 어디서든지 참조 가능하다.

 

지역변수는 블록 내부에서만 유효하다.

 

스코프 체인

함수의 중첩에 따라 지역 스코프 또한 중첩되는데 이는 스코프가 함수의 중첩에 의해 계층적 구조를 갖는다는 의미이다.

이처럼 스코프가 계층적으로 연결 된 것을 스코프 체인이라고 한다.

 

자바스크립트 엔진은 변수를 참조할때 최하단 지역 스코프부터 시작하여 전역 스코프 방향으로 이동하며 검색한다.

이를 통해 상위 스코프의 변수도 참조가 가능하다.

변수가 검색이 된 시점에서 참조를 실행하고 검색을 종료하므로 자바스크립트는 하위 스코프에 있는 변수를 우선적으로 참조한다.

 

참고로 var로 선언한 변수는 블록 레벨 스코프가 아닌 함수 레벨 스코프이므로 블록문 내부 변수는 전역변수가 된다.

 

 

let x = 1;

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

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

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

위에 예제레서 실행 결과는 bar 함수의 상위 스코프가 무엇인지에 따라 결정되는데 예측되는 패턴으로는

-함수를 어디서 호출했는지에 따라 정한다

-함수를 어디서 정의했는지에 따라 정한다

 

첫번째 방식을 동적 스코프라고 한다.

두번째 방식은 렉시컬 스코프 혹은 정적 스코프라고 하는데 자바스크립트를 포함한 대부분의 언어는 렉시컬 스코프를 따른다.

 

렉시컬 스코프는 함수 정의가 평가되는 시점에서 상위 스코프를 결정한다.

함수가 호출된 위치는 상위 스코프 결정에 영향을 주지 않으며 언제나 자신이 정의된 스코프가 상위 스코프다.