모던 자바스크립트 Deep Dive : 13장 스코프

EdLee·2022년 10월 29일

javascript

목록 보기
3/37

13장 스코프

1. 스코프의 종류


구분설명스코프변수
전역코드의 가장 바깥 영역전역 스코프전역 변수
지역함수 몸체 내부지역 스코프지역 변수

1.1 전역 스코프와 지역 스코프

스코프가 다르다면, 변수명은 중복될 수 있다

var x = "global";

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

foo(); // local;
console.log(x); // global;
  • var는 같은 스코프 내에서도 변수 중복 선언이 가능하지만, 실수로도 그렇게 쓰지 말 것🤮
  • 그리고 만약 스코프가 수직으로 다르더라도 같은 변수명 중복은 무조건 피할 것

2. 스코프 체인


스코프가 중첩되어 계층 구조를 갖는 것

  • 상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있다.
  • 하위 스코프에서 유효한 변수는 상위 스코프에서 참조할 수 없다.
    ※ 참고 : 변수 검색은 하위 스코프 -> 상위 스코프 순으로 이뤄지기 때문에 위와 같은 현상이 발생하는 것

스코프 체인과 함수 호이스팅

function foo() {
  console.log('global foo');
}

function bar() {
  foo(); // local foo
  function foo() {
    console.log('local foo');
  }
  foo(); // local foo
}

bar();
foo(); // global foo
  • bar() 안에서 foo() 호출 시, global이 아닌 local이 호출된 것에 주목😳
  • 스코프가 일종의 네임스페이스란 것을 이해한다면 헷갈리지 않을 것

3. 함수 레벨 스코프


  • c++, java 등 대부분의 언어에서는 코드 블록 단위로 스코프가 생성
#include <iostream>
#include <string>

int main() {
    int x = 1;
    {
        int x = 10;
        std::cout << x << std::endl; // 10
    }
    std::cout << x << std::endl; // 1
}
  • js의 var는 함수 레벨 단위로 스코프가 생성
  var x = 1;

  {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10

4. 렉시컬 스코프


함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정한다

스코프 결정 방식

  • 동적 스코프 : 함수를 호출하는 위치에 따라 해당 함수의 상위 스코프 결정
  • 정적 스코프(렉시컬 스코프) : 함수를 정의한 위치에 따라 해당 함수의 상위 스코프 결정

JS를 포함해 대부분의 프로그래밍 언어는 렉시컬 스코프를 따른다

var x = 'global';

function foo() {
  var x = 'local';
  bar();
}

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

foo(); // global
bar(); // global

유의사항

  • js는 함수 레벨 스코프 (반면, 다른 대부분의 언어는 블록 레벨 스코프)
  • js는 렉시컬 스코프

0개의 댓글