JavaScript - Scope

이소라·2022년 10월 31일
0

JavaScript

목록 보기
7/22

1. 스코프

  • 스코프(Scope)
    • 식별자가 유효한 범위
      • 모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정됨
    • JavaScript 엔진이 식별자를 검색할 때 사용하는 규칙
      • JavaScript 엔진은 스코프를 통해 어떤 변수를 참조해야할지 결정함
    • 스코프 내에서 식별자는 유일해야 함
    • 다른 스코프에는 같은 이름의 식별자를 사용 가능함

스코프의 종류

  • 코드는 전역(global) 코드와 지역(local) 코드로 구분할 수 있음

    • 전역 코드 : 코드의 가장 바깥 영역
    • 지역 코드 : 함수 몸체 내부
  • 변수는 자신이 선언된 위치(전역/지역)에 의해 스코프가 결정됨

    • 전역 변수
      • 전역(코드의 가장 바깥 영역)에서 선언한 변수
      • 전역 스코프를 가짐
      • 전역 변수는 어디서든지 참조 가능함
    • 지역 변수
      • 지역(함수 몸체 내부)에서 선언한 변수
      • 지역 스코프를 가짐
      • 지역 변수는 자신의 지역 스코프와 하위 지역(중첩 함수) 스코프에서 유효함

스코프 체인

  • 함수는 전역뿐만 아니라 함수 몸체 내부에서도 정의할 수 있음

    • 함수의 중첩 : 함수 몸체 내부에서 함수가 정의된 것
    • 중첩 함수(nested function) : 함수 몸체 내부에서 정의한 함수
    • 외부 함수(outer function) : 중첩 함수를 포함하는 함수
  • 함수가 중첩 가능하므로, 함수의 지역 스코프도 중첩 가능함

    • 스코프는 함수의 중첩에 의해 계층적 구조를 가짐
      • 중첩 함수의 지역 스코프는 외부 함수의 지역 스코프와 계층적 구조를 가짐
      • 외부 함수의 지역 스코프 = 중첩 함수의 상위 스코프
    • 스코프 체인(scope chain)
      • 모든 스코프가 하나의 계층 구조로 연결됨
      • 실행 컨텍스트의 렉시컬 환경을 단방향으로 연결한 것
      • 모든 지역 스코프의 최상위 스코프 = 전역 스코프
  • 변수를 참조할 때 JavaScript 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색함

    • 상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있지만, 하위 스코프에서 유효한 변수를 참조할 수 없음 (스코프 체인이 단방향 linked list이므로)
  • 함수를 호출할 때 JavaScript 엔진은 스코프 체인을 통해 함수를 가리키는 식별자를 검색함


4. 함수 레벨 스코프

  • 블록 레벨 스코프(block level scope)
    • 함수 몸체만이 아니라 모든 블록(if, for, while, try/catch 등)이 지역 스코프를 만듬
  • 함수 레벨 스코프(function level scope)
    • 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정
    • var 키워드로 선언된 변수는 함수 레벨 스코프를 가짐

5. 렉시컬 스코프

  • 동적 스코프(dynamic scope)

    • 함수를 어디서 호출했는지에 따라 함수의 상위 스코프를 결정함
      • 함수를 정의하는 시점에는 함수가 어디서 호출될지 알 수 없음
      • 함수가 호출되는 시점에 동적으로 상위 스코프를 결정함
  • 렉시컬 스코프(lexical scope) / 정적 스코프(static scope)

    • 함수를 어디서 정의했는지에 따라 함수의 상위 스코프를 결정함
      • 함수 정의가 평가되는 시점에 상위 스코프가 정적으로 결정됨
      • 상위 스코프가 동적으로 변하지 않음
  • JavaScript는 렉시컬 스코프를 따름

    • 함수를 어디서 정의했는지에 따라 상위스코프를 결정함
    • 함수가 호출된 위치는 상위 스코프 결정에 영향을 주지 않음
    • 함수의 상위 스코프 = 자신이 정의된 스코프
      • 함수 정의가 실행되어 생성된 함수 객체는 함수가 정의된 상위 스코프를 기억함

0개의 댓글