You Don't Know JS Yet
스코프
- 스코프가 중첩될때 expression이나 statement는 해당 레벨 혹은 더 높거나 바깥 레벨에 있는 변수에만 접근 가능 -> lexical scope
- js의 스코프와 관련된 특징
- hoisting
- var로 선언된 변수를 함수 기준으로 스코프가 만들어짐
클로저
- 함수가 정의된 스코프가 아닌 다른 스코프에서 함수가 실행되더라도, 스코프 밖에 있는 변수를 기억하고 이 외부 변수에 계속 접근할 수 있는 경우
- 함수의 특징
- 클로저는 변수를 snapshot한 값을 사용하는 것이 아닌, 직접적인 관계를 맺음
this
- 함수는 this 키워드를 통해 실행 컨텍스트에 접근함
- 스코프는 정적(static), 실행 컨텍스트는 동적(dynamic)
프로토타입
- this는 함수 실행, 프로토타입은 객체, 프로퍼티에 접근할 때 일어나는 동작
- prototype chain: 프로토타입을 통해 연결된 일련의 격체
- 객체 B에서 다른 객체 A을 연결하여 위임을 받아 해당 접근을 처리함
- Prototype Link, Prototyupe Object를 통틀어 prototype이라고 부르는 것임
- 객체는 함수로 생성됨, Object는 js에서 기본적으로 제공하는
- 참고
prototype object
- 함수를 생성하면 prototype object도 같이 생성됨
- 함수는 prototype이라는 속성을 통해 prototype object에 접근할 수 있음
- constructor와 proto를 가지고 있음
- constructor는 같이 생성된 함수를 가리킴
- proto는 prototype link
prototype link
- prototype 속성은 함수만 가지고 있지만, proto속성은 모든 객체가 빠짐없이 가지고 있음
- 조상이었던 함수의 prototype object를 가리킴
- 이렇게 상위 프로토타입과 연결되어있는 형태를 프로토타입 체인이라고 함
- Object.create()를 사용해 직접 연결할 수 있음
- Object.create(null)을 호출하면 순수 독립 객체
- 이러한 연결을 사용하는 방법을 prototypal class라고 함
값 vs 참조
- js에서는 값을 전달할지, 참조를 전달할지 개발자가 선택하지 않고 값의 타입으로 결정됨
- 원시 타입은 값이 복사되어 전달
- 객체값(객체, 배열, 함수 등)은 참조로 전달
컴파일 vs 인터프리트
- compilation은 프로그램을 한 번에 처리, interpretation은 소스 코드를 한 줄씩 변환
- 스코프는 컴파일 중에 결정됨
- 1단계: tokenizing - stateless 방식으로 인식, lexing - stateful 방식으로 인식
- 2단계: 토큰 배열을 AST(abstract syntax tree, 추상 구문 트리)로 바꿈, 문법 구조를 반영
- 3단계: AST를 컴퓨터가 실행 가능한 코드로 변환
- 프로그램 실행 전에 코드 전체가 파싱됨
- 스코프는 프로그램이 컴파일될 때 결정되고, 런타임 환경에 영향을 받지 않음
- 예외 2가지(하지 말아야할 것): eval(), with
렉시컬 스코프
- comilation 중 스코프가 결정되는 방식
- 렉시컬은 컴파일 1단계의 lexing을 의미함
스코프 체인
- 탐색
- 현재 파일에서 찾지 못한 변수를 런타임에 다른 파일이 전역에 선언할 가능성도 있음
- 스코프는 런타임에 결정됨
- 섀도잉