프로그래밍의 기본은 1.변수에 값을 저장 2.저장된 값을 사용 및 수정 하는 것이다.
여기서 생기는 자연스러운 의문
따라서 프로그램을 잘 실행하려면 변수의 저장과 탐색을 잘 정의한 규칙이 필요하다. 이 규칙을 스코프 라 한다.
즉 스코프는 확인자 이름으로 변수를 찾기위한 규칙의 집합이다.
자바스크립트는 인터프리터 언어로 알려져있으나 사실은 컴파일러 언어이다.
다만 미리 컴파일을 완료해두는 것이 아닌 코드실행 직전에 컴파일 작업을 진행함.
전통적인 컴파일 언어의 처리과정, 3단계로 구성되어 잇다
문자열을 의미있는 조각(토큰)으로 나누는 과정
문장을 자신의 구성 성분으로 분해하고 위계 관계를 분석하여 문장의 구조를 결정하는 것
문법 구조를 반영하여 토큰 배열을 중첩원소를 갖는 트리형태(추상 구문 트리, AST)로 바꾸는 과정
AST를 실행코드로 바꾸는 과정
var a = 2;
라는 코드를 엔진, 컴파일러, 스코프가 어떻게 실행하는지 살펴보자
컴파일러가 렉싱과 파싱을 통해 트리구조를 생성
2-1 컴파일 진행 중 var a
를 만나면 스코프가 특정 스코프 컬렉션에 있는지 확인
2-2 컴파일러는 엔진이 a =2
을 실행할 수 있는 코드 생성, 엔진은 그 코드를 실행하고 a
라 부르는 변수를 스코프 컬렉션 내에서 접근 가능한지 확인
a
사용즉 컴파일러가 변수를 선언 (스코프 컬렉션내에 이미 있다면 무시)
-> 엔진이 스코프에서 변수 탐색
-> 있다면 값을 대입, 없다면 다른 스코프에서 탐색
블록이나 함수는 다른 블록이나 함수에 중첩될 수 있다.
따라서 탐색 대상인 변수를 찾지 못하면 외부의 스코프로 넘어가서 탐색을 계속 진행하는데 이 때 가장 바깥 스코프(글로벌 스코프)에 도달할 때까지 계속한다.
대입 연산을 수행하기 위해 변수를 찾는 검색, 일반적으로 변수가 대입연산자의 왼쪽에 있을 때 수행
LHS가 아닌 검색으로 특정변수에 저장되어 있는 값을 찾는 것으로 Retrieve His/Her Source 로 생각하면 편하다.
개념적으로 LHS는 대입할 대상, RHS는 대입한 값을 찾는다고 생각하면 된다.
RHS 검색이 중첩 스코프 안에서 대상 변수를 찾지 못한다면 ReferenceError
를 발생 시킨다.
TypeError
발생ReferenceError
발생