본문 바로가기
JavaScript/모던 자바스크립트 Deep Dive 스터디

13장 스코프

by 정ㅇr 2022. 10. 12.
728x90

* 해당 글은 모던 자바스크립트 Deep Dive를 공부하며 정리한 글입니다. *

 

스코프

- 유효범위, 자바스크립트에서 크게 예시로 드는 것은 var와 let, const 차이

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

- 식별자가 유효한 범위

 

var 와 let의 비교 코드

// var 예시
function foo() {
    var x = 1;
    // 여기서 자바스크립트 엔진이 아래 코드를 var가 없는 x 재할당으로 인식하고 동작한다.
    var x = 2;
    console.log(x); // 2
}
foo();
// let 예시
function bar() {
    let x = 1;
    // let, const 로는 같은 스코프 내에서 중복 선언을 허용하지 않는다.
    let x = 2; // SyntaxError: Identifier 'x' has already been declared
}
bar();

 

스코프의 종류

구분 설명 특징
전역 스코프 코드의 가장 바깥 영역 - 어디서든 참조할 수 있음
지역 스코프 함수 내부 - 자신의 지역 스코프 및 하위 지역 스코프에서 참조 가능

 

스코프 체인

- 스코프가 계층적으로 연결된 것을 말한다.

- 변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드이 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.

 

함수 레벨 스코프

- 함수에 의해서만 지역 스코프가 생성된다는 의미

- var 키워드로 선언된 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정한다.

(if, for, while, try/catch 등의 블록 레벨 스코프는 인정하지 않음)

var x = 1;

if (true) {
    // var 키워드로 선언된 변수는 함수의 코드 블록만을 지역 스코프로 인정함
    // 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 모두 전역변수로 해당
    // 따라서 x는 전역 변수다
    // 이미 선언된 전역 변수가 있으므로 재할당이 일어난다.
    var x = 10;
}
console.log(x); // 10

for, while, try/catch에 경우에도 위와 같은 상황이 발생하게 된다.

 

렉시컬 스코프

- 정적 스코프라고도 부른다.

- 동적 스코프 방식처럼 상위 스코프가 동적으로 변하지 않고, 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정되기 때문에 정적 스코프라고 부른다.

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

- 렉시컬 스코프는 클로저와 깊은 관계가 있다. (책의 24장 참조)

var x = 1;

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

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

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

결론부터 말하자면 foo, bar 함수의 결과값은 둘 다 1이 나온다.

자바스크립트는 렉시컬 스코프를 따르므로 "함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지"에 따라 상위 스코프를 결정한다.

즉, 함수의 상위 스코프는 언제나 자신이 정의된 스코프다.

반응형

'JavaScript > 모던 자바스크립트 Deep Dive 스터디' 카테고리의 다른 글

25장 클래스  (0) 2022.11.01
20장 strict mode  (0) 2022.10.26
16장 프로퍼티 어트리뷰트  (0) 2022.10.17
11장 원시 값과 객체의 비교  (1) 2022.10.04
7장 연산자  (0) 2022.09.29

댓글