Notes from reading 🔖 You Don't Know JS Yet - 6

## 파트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은 가독성에 끔찍하므로 쓰지 말자

 

  • 컴파일로 정해지는 스코프는 렉시컬 스코프라고 한다 🦕
  • 렉시컬 스코프는 코드 배치에 따라서 함수, 블록, 변수 선언의 스코프가 변경된다.

 

  • 컴파일레이션은 스코프와 변수의 메모리 예약 관점에서 실제로는 아무것도 하지 않음 (프로그램을 실행하지 않기 때문)
  • 컴파일 과정에서 렉시컬 스코프 지도를 만든다는 것이 중요
  • 즉, 런타임 전까지 스코프는 식별만 되고 생성되지는 않음 💧