## 파트2 - chapter 1
🍋 부록 B는 연습문제
- 주어진 구문에서 접근 가능한 변수를 JS 엔진이 어떻게 결정하나?
- 이름이 같은 두 변수의 경우 어떻게 처리되나?
- 위의 두 질문에 대답하기 위해서 스코프를 잘 알아야 한다 👍
- JS는 일반적으로 스코프 언어, 따라서 실행 전 파싱 및 컴파일이 일어남 (위에서 아래로 실행되지만)
- 스코프 규칙은 컴파일 단계에서 결정되고, 런타임에서는 잘 변경되지 않는다 🍣
- JS에서 함수는 일급값 (함수는 어디서 호출되던 정의할 때 결정된 스코프를 따름 -> 클로저)
- 모듈은 코드 정리를 위한 디자인 패턴. 스코프를 통해 제한된 변순나 함수를 설정할 수 있고 접근할 수도 있다.
- 고전 컴파일러 이론
- 1단계 토크나이징/렉싱 -> 2단계 파싱 -> 3단계 코드 생성 (AST to Code)
- JS엔진은 좀 더 복잡하다 (실행 최적화를 위한 추가 작업이 있다)
- JS 프로그램은 필연적으로 파싱 및 컴파일을 거친다 🌽
- ECMA 명세서에 컴파일이 필수라고는 안했는데, 명세서 요구사항 충족을 위해서 선 컴파일이 필요하다
- 컴파일을 하기에, JS는 구문 오류, 초기 오류, 호이스팅과 같은 특징을 가진다. (TDZ는 추후 알아본다)
- 컴파일 없이 실행할 수 있긴 한데, 아주 비효율적
- 변수/식별자의 역할은 선언되는 경우를 제외하면, 타깃과 소스 (할당되기, 할당해주기)
- 선언식으로 함수를 사용하면, 스코프가 구성되기 시작하는 시점에 자동으로 설정된다.
- 타겟과 소스 구분해서 이해하기 (이해가 잘 되는듯 마는듯... 추후 다시 다룬다고 함)
- 런타임에서 스코프를 변경할 수 있긴 하다.
- 두 가지 방법이 있고, 하나는 eval()이다 👽
- eval은 인자로 받는 소스코드를 실행하고, var 혹은 function 선언을 만나면 eval()이 실행중인 스코프를 변경한다
- eval()은 여러 이유로 사용이 비추천인데, 큰 이유는 성능 (컴파일 최적화 다 했는데 스코프가 수정되면 다시 CPU 자원을 씀)
- 두 번째는 with 키워드이다
- with은 동적으로 특정 객체의 스코프를 지역 스코프로 변경한다. (이를 통해 객체를 통하지 않고 해당 객체 프로퍼티 접근 가능)
- with은 가독성에 끔찍하므로 쓰지 말자
- 컴파일로 정해지는 스코프는 렉시컬 스코프라고 한다 🦕
- 렉시컬 스코프는 코드 배치에 따라서 함수, 블록, 변수 선언의 스코프가 변경된다.
- 컴파일레이션은 스코프와 변수의 메모리 예약 관점에서 실제로는 아무것도 하지 않음 (프로그램을 실행하지 않기 때문)
- 컴파일 과정에서 렉시컬 스코프 지도를 만든다는 것이 중요
- 즉, 런타임 전까지 스코프는 식별만 되고 생성되지는 않음 💧
'JavaScript' 카테고리의 다른 글
Notes from reading 🔖 You Don't Know JS Yet - 5 (0) | 2025.06.11 |
---|---|
Notes from reading 🔖 You Don't Know JS Yet - 4 (0) | 2025.06.05 |
Notes from reading 🔖 You Don't Know JS Yet - 3 (0) | 2025.05.27 |
Notes from reading 🔖 You Don't Know JS Yet - 2 (0) | 2025.05.14 |
Notes from reading 🔖 You Don't Know JS Yet - 1 (0) | 2025.04.16 |