[TIL] 스코프 2021-08-02

Dorr·2021년 8월 4일
0

TIL

목록 보기
1/13
post-custom-banner

스코프(Scope) 란?

프로그래밍의 기본은 1.변수에 값을 저장 2.저장된 값을 사용 및 수정 하는 것이다.

여기서 생기는 자연스러운 의문

  • 변수는 어디에 저장되는가
  • 저장된 변수를 어떻게 찾는가

따라서 프로그램을 잘 실행하려면 변수의 저장과 탐색을 잘 정의한 규칙이 필요하다. 이 규칙을 스코프 라 한다.

즉 스코프는 확인자 이름으로 변수를 찾기위한 규칙의 집합이다.


컴파일러 이론

자바스크립트는 인터프리터 언어로 알려져있으나 사실은 컴파일러 언어이다.
다만 미리 컴파일을 완료해두는 것이 아닌 코드실행 직전에 컴파일 작업을 진행함.

컴파일레이션(Compilation)

전통적인 컴파일 언어의 처리과정, 3단계로 구성되어 잇다

1. 토크나이징(Tokenizing) / 렉싱(Lexing)

문자열을 의미있는 조각(토큰)으로 나누는 과정

2. 파싱(Parsing)

문장을 자신의 구성 성분으로 분해하고 위계 관계를 분석하여 문장의 구조를 결정하는 것

문법 구조를 반영하여 토큰 배열을 중첩원소를 갖는 트리형태(추상 구문 트리, AST)로 바꾸는 과정

3. 코드 생성(Code-Generation)

AST를 실행코드로 바꾸는 과정


스코프에 대한 이해

var a = 2;라는 코드를 엔진, 컴파일러, 스코프가 어떻게 실행하는지 살펴보자

1단계

컴파일러가 렉싱과 파싱을 통해 트리구조를 생성

2단계

2-1 컴파일 진행 중 var a를 만나면 스코프가 특정 스코프 컬렉션에 있는지 확인

  • 변수 a가 있다면 선언을 무시하고 지나감
  • 없다면 새로운 변수 a를 스코프 컬렉션에 선언하라 요청

2-2 컴파일러는 엔진이 a =2을 실행할 수 있는 코드 생성, 엔진은 그 코드를 실행하고 a라 부르는 변수를 스코프 컬렉션 내에서 접근 가능한지 확인

  • 가능하면 변수 a사용
  • 불가능하면 다른 곳(그 밖의 스코프)에서 탐색한다.

정리

즉 컴파일러가 변수를 선언 (스코프 컬렉션내에 이미 있다면 무시)
-> 엔진이 스코프에서 변수 탐색
-> 있다면 값을 대입, 없다면 다른 스코프에서 탐색

중첩 스코프

블록이나 함수는 다른 블록이나 함수에 중첩될 수 있다.
따라서 탐색 대상인 변수를 찾지 못하면 외부의 스코프로 넘어가서 탐색을 계속 진행하는데 이 때 가장 바깥 스코프(글로벌 스코프)에 도달할 때까지 계속한다.

LHS 참조 와 RHS 참조

LHS 검색(Left-Hand Side)

대입 연산을 수행하기 위해 변수를 찾는 검색, 일반적으로 변수가 대입연산자의 왼쪽에 있을 때 수행

RHS 검색(Right-hand Side)

LHS가 아닌 검색으로 특정변수에 저장되어 있는 값을 찾는 것으로 Retrieve His/Her Source 로 생각하면 편하다.

개념적으로 LHS는 대입할 대상, RHS는 대입한 값을 찾는다고 생각하면 된다.

오류

RHS 검색 실패시

RHS 검색이 중첩 스코프 안에서 대상 변수를 찾지 못한다면 ReferenceError를 발생 시킨다.

  • RHS 검색 결과 변수를 찾았지만 그 값으로 처리할수 없는 일을 하려고 할 때는 TypeError 발생

LHS 검색 실패시

  • Strict Mode 동작 o - ReferenceError 발생
  • Strict Mode 동작 x - 글로벌 스코프에 대상 변수 생성
post-custom-banner

0개의 댓글