1. 2 스코프 이해하기
엔진 : 컴파일레이션의 시작부터 끝까지 전 과정과 자바스크립트 프로그램 실행을 책임진다.
컴파일러 : 엔진의 친구, 파싱과 코드 생성의 모든 잡일을 맡는다.
스코프 : 선언된 모든 확인자 검색 목록을 작성하고 유지한다. 엄격한 규칙을 강제하여 현재 실행 코드에서 확인자의 적용방식을 정한다.
1. 2. 2앞과 뒤
"var a = 2;"
엔진은 하나의 구문을 두 개의 서로 다른 구문으로 본다.
하나는 컴파일러가 컴파일레이션 과정에서 처리할 구문이고, 다른 하나는 실행 과정에서 엔진이 처리할 구문이다.
컴파일러의 첫 번째 일은 렉싱을 통해 구문을 토큰으로 쪼갠다. 그 후 토큰을 파싱해 트리 구조로 만든다.
코드 생성 과정에 들어가면 컴파일러는 다음처럼 프로그램을 처리한다.
1. 컴파일러가 'var a'를 만나면 스코프에게 변수 a가 특정한 스코프 컬렉션 안에 있는지 묻는다. 변수 a가 이미 있다면 컴파일러는 선언을 무시하고 지나가고, 그렇지 않으면 컴파일러는 새로운 변수 a를 스코프 컬렉션내에 선언하라고 요청
2. 그 후 컴파일러는 'a = 2' 대입문을 처리하기 위해 나중에 엔진에서 실행 가능한 코드를 생성. 엔진이 실행하는 코드는 먼저 스코프에게 a라 부르는 변수가 현재 스코프 컬렉션 내에서 접근할 수 있는지 확인. 가능하다면 엔진은 변수 a를 사용하고, 아니라면 엔진은 다른 곳(다른 스코프)를 살핀다.
엔진이 변수를 찾으면 변수에 값 2를 넣고, 찾지 못한다면 에러가 발생한다.
별개의 두 가지 동작을 취하여 변수 대입문을 처리한다.
첫째, 컴파일러가 변수를 선언한다.
둘째, 엔진이 스코프에서 변수를 찾고 있다면 값을 대입한다.
1. 2. 3 컴파일러체
LHS검색은 변수가 대입 연산자의 왼쪽에 있을 때 수행
RHS검색은 변수가 대입 연산자의 오른쪽에 있을때 수행한다. RHS검색은 정확히 그 자체로는 '대입문의 오른쪽'이 아니다. 정확히는 '왼편이 아닌 쪽'에 가깝다. 가서 값을 가져오라는 뜻으로 이해
console.log(a);
a에 대한 참조는 RHS 참조다. 구문에서 a에 아무것도 대입하지 않기 때문이다. 대신 a의 값을 가져와 넘겨준다.
a = 2;
a에 대한 참조는 LHS 참조다. 현재 a값을 신경 쓸 필요 없이 '= 2' 대입 연산을 수행할 변수를 찾기 떄문이다.
'Programming > JavaScript' 카테고리의 다른 글
래퍼 객체 (wrapper object) (0) | 2023.03.24 |
---|---|
[Javascript] Call by value vs Call by reference (0) | 2021.10.23 |
[Javascript] 기본형과 참조형 (0) | 2021.10.17 |
스코프란 무엇인가(3) (0) | 2020.08.15 |
스코프란 무엇인가(1) (0) | 2020.07.28 |