변수와 불변성, 실행 컨텍스트, 클로저, 콜백 함수, 클로저, 프로토타입과 클래스와 같이 자바스크립트의 핵심적인 내용을 다룬다 1. 원시값은 불변하고, 참조값은 가변한다. 여기서 불변과 가변의 차이점은 데이터 영역이 변하지 않느냐, 변하느냐이다. 원시값은 변수 영역에서 데이터 영역에 대한 참조를 저장하고, 이 참조를 변경한다. 그에 반해 참조값은 변수 영역에 데이터 영역에 대한 참조를 저장하고, 데이터 영역에는 여러 개의 변수 영역에 대한 참조를 저장하고 있다. 또한, 원시값은 이 데이터 영역에 대한 포인터를 변경하는 반면(변수 영역은 변하지만 데이터 영역은 변하지 않는다), 참조값은 데이터 영역의 값을 변경하여 변수 영역에 대한 포인터들을 변경한다.(변수 영역은 변하지 않지만 데이터 영역은 변한다) 그래서 우리는 원시값을 불변값, 참조값을 가변값이라 한다. - 상수와 변수는 재할당이 가능한지에 대한 여부이니 헷갈리면 안된다. 2. 실행 컨텍스트는 함수를 실행했을 때 정보를 모아놓은 객체이다. Variable Environment, Lexical Environment, This Binding으로 이루어져있다. Variable Environment는 Lexical Environment의 초기 스냅샷으로 내부 구조는 동일하다. Lexical Environment은 실시간으로 변경이 되며 Environment Record, OuterEnvironment Reference로 구성되어 있다. Environment Record에는 실행 컨텍스트 내부의 식별자를 저장하고 있다. OuterEnvironment Reference에는 외부 실행 컨텍스트의 Environment Record를 가리키고 있으며, 현재 실행 컨텍스트 내 Environment Record에 식별자가 없을 시 OuterEnvironment Refernece를 타고 올라가 식별자를 찾는다. 이를 통해 스코프 체이닝이라 한다. 3. this는 함수를 실행했을 때 실행 컨텍스트 내부에 존재하는 바인딩 중 하나이다. 다시 말해 this는 동적으로 결정이 되며 ‘어떻게 함수를 호출했느냐’에 따라 결정된다. 객체 뒤의 . 혹은 대괄호 접근법을 통해 실행을 했다면 해당 객체를 가리키고 일반 함수로 실행을 했다면 전역 객체를 가리킨다. 함수의 this를 바꾸기 위해서는 apply, call, bind를 사용하거나, 다른 변수에 this를 할당하거나, 화살표 함수를 사용하는 방식 등이 있다. 4. 콜백 함수는 함수의 인자로 넘긴 함수를 의미한다. 콜백 함수의 실행 주체는 함수를 넘긴 함수가 가지며 this 또한 이 함수가 결정할 수 있다. apply, call, bind를 통해 this를 변경하면 해당 메서드의 인자에 따라 this가 가리키는 객체가 변경되고 그렇지 않다면 전역 객체를 가리키게 된다. 5. 비동기적인 코드를 동기적으로 처리하기 위해서는 Promise, Generator를 사용하는 방식이 있다. 6. 클로저란 내부 함수가 외부 함수의 변수에 접근하고, 이 내부 함수를 반환할 경우 외부 함수가 종료된 이후에도 외부 함수 내 변수에 접근 가능한 것을 의미한다. 이를 통해 외부로부터 데이터에 접근하지 못하게하는 데이터 은닉이 가능하고 외부 함수가 종료된 이후로도 외부 함수 내 변수에 접근할 수 있는 데이터 보존이 가능하다. 또한 일부 인자만 넘기고 추후 나머지 인자를 넘기는 부분 적용 함수, 하나의 인자씩만 넘기고 마지막에 실행을 하는 커링도 구현할 수 있다. 7. 자바스크립트는 프로토타입 언어이며, 어떤 객체를 원형으로 삼고, 이를 복제(참조)함으로써 상속과 비슷한 효과를 얻는다. 인스턴스를 만들면 __proto__라는 프로퍼티가 존재하고 이 프로퍼티는 생성자 함수의 prototype프로퍼티를 참조한다. __proto__는 생략이 가능하며 인스턴스를 통해 생성자 함수의 prototype프로퍼티에 접근이 가능하다. 모든 프로토타입 체인 상 최상단에는 Object.prototype이 존재한다.
헷갈렸던 내용에 대해 한 번씩 긁은 기분이었다. 그리고 한 편으로는 모던 자바스크립트 Deep Dive 책이 참 대단하다고 한 번 더 느꼈다. 전부 이 책에서 읽은 내용이었기 때문이다. 코어 자바스크립트는 이 모던 자바스크립트 Deep Dive 책에서 핵심적인 내용만 선별하여 더 풍부한 사례와 함께, 그리고 귀에 쏙쏙 박히는 설명으로 알려주는 느낌이랄까. 어찌되었든 다시 자바스크립트의 핵심적인 내용을 한 번 더 짚어 유익한 시간이었다. 자바스크립트와 조금 더 친해진 기분이다.