- ECMAScript 사양에 명시된 소스코드는 어떤 특징이 있고, 타입에는 무엇이 있는가?
: 소스코드는 평가 과정에서 실행 컨텍스트를 생성함
: 타입으로는 전역 코드, 함수 코드, eval 코드, 모듈 코드가 존재함
- 전역 코드의 특징은 무엇인가?
: 전역 스코프 생성, 생성한 전역 스코프를 통해 전역 변수와 전역 함수 관리
- 함수 코드의 특징은 무엇인가?
: 지역 스코프 생성, 생성한 지역 스코프를 통해 지역 변수, 매개변수,
arguments
객체 관리
- 자바스크립트 엔진은 어떤 과정을 거쳐서 소스코드를 해석하는가?
: 먼저 소스코드를 평가한 후에, 그 평가를 바탕으로 소스코드를 실행함
- 실행 컨텍스트가 소스코드 평가 단계에서 만들어지는 이유는 무엇인가?
: 식별자가 소스코드 평가 단계에서 선언되므로 이를 기억해놓을 공간이 필요함
- 실행 컨텍스트의 역할은 무엇인가?
: 스코프와 식별자, 코드 실행 순서를 관리하는 역할
: 즉 자바스크립트의 소스코드를 실행하는 데 필요한 환경을 제공하고 실행의 결과를 실제로 관리
- 렉시컬 환경이란 무엇인가?
: 실행 컨텍스트 생성 시 실행 컨텍스트의 프로퍼티로 바인딩되는 객체, 즉 실행 컨텍스트를 구성하는 컴포넌트
: 식별자, 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 관리함
- 렉시컬 환경은 어떻게 구성되어 있는가?
: 환경 레코드와 외부 렉시컬 환경에 대한 참조
- 환경 레코드는 무엇인가?
: 스코프에 포함된 식별자를 등록하고, 식별자에 바인딩된 값을 관리하는 저장소
- 환경 레코드는 어떻게 구성되어 있는가?
: 전역 렉시컬 환경의 환경 레코드는 객체 환경 레코드와 선언적 환경 레코드로 구성되어 있음
: 함수 렉시컬 환경의 환경 레코드는 구분 없이 구성되어 있음
: 전역 렉시컬 환경의 경우 ES6 이후 추가된let
,const
키워드와 ES6 이전의var
키워드를 구분하기 위해 환경 레코드를 나눠서 관리함
- 객체 환경 레코드에는 무엇이 저장되는가?
:
var
키워드로 선언한 전역 변수
: 함수 선언문으로 정의한 전역 함수
: 빌트인 전역 프로퍼티
: 빌트인 전역 함수
: 표준 빌트인 객체
- 선언적 환경 레코드에는 무엇이 저장되는가?
:
let
,const
키워드로 선언한 전역 변수
- 실행 컨텍스트 내부에서
this
는 어떤 방식으로 저장되는가?: 렉시컬 환경의 내부 슬롯인
[[ThisValue]]
의 값에 저장됨
: 전역 렉시컬 환경의 경우 무조건 기본 값은window
, 즉 전역 객체
: 함수 렉시컬 환경의 경우에도 기본 값은 전역 객체이지만, 호출되는 방식에 따라[[ThisValue]]
에 할당된 값이 변경됨
- 외부 렉시컬 환경에 대한 참조는 무엇인가?
: 렉시컬 환경에 존재하면서 현재 평가 중인 소스코드를 포함하는 외부 소스코드의 렉시컬 환경, 즉 상위 스코프를 가리킴
: 상위 스코프를 가리키기 때문에 외부 렉시컬 환경에 대한 참조의 연결을 통해 스코프 체인을 구현할 수 있음
: 전역 렉시컬 환경의 경우 스코프 체인의 종점에 있기 때문에 그 값으로null
이 할당됨
: 함수 렉시컬 환경의 경우 함수가 정의된 시점에 실행 중인 실행 컨텍스트의 렉시컬 환경 참조가 할당됨
- 블록문의 경우 실행 컨텍스트를 생성하는가?
: 실행 컨텍스트는 생성하지 않지만 독립적인 렉시컬 환경은 생성함
- 블록문의 렉시컬 환경 생성은 어떤 과정으로 진행되는가?
: 런타임 시 블록문을 만나면 독립적인 렉시컬 환경을 생성하여 구성함, 그 후 블록문 이전의 실행 컨텍스트에 생성한 렉시컬 환경의 참조가 할당됨
- 클로저는 무엇인가?
: 함수와 그 함수가 선언된 렉시컬 환경과의 조합
: 즉 함수가 자신의 스코프뿐만 아니라 상위 스코프까지 함께 기억하고 있는 것을 의미
- 클로저는 어떻게 구현되는가?
: 함수가 정의되어 평가될 때 자신의 내부 슬롯인
[[Environment]]
의 값으로 정의된 시점에 실행 중인 실행 컨텍스트의 렉시컬 환경을 저장함
:[[Environment]]
에 저장된 값은 함수 호출 시 생성되는 실행 컨텍스트의 렉시컬 환경이 가지고 있는 외부 렉시컬 환경에 대한 참조에 저장됨
: 함수의 참조가 끊어지지 않는 한 함수 자신의 렉시컬 환경은 소멸되지 않으므로 외부 함수의 생명 주기가 종료되더라도 렉시컬 환경을 토대로 외부 함수의 변수를 참조할 수 있게 됨
- 클로저가 실질적으로 의미를 가지려면 어떤 조건을 충족해야 하는가?
: 내부 함수가 외부 함수보다 생명 주기가 길어야 함
: 내부 함수가 외부 함수의 식별자를 하나 이상 참조해야 함
- 클로저는 왜 사용하는가?
: 상태(프로퍼티)를 안전하게 유지 및 변경하기 위해서
- 정보 은닉이란 무엇인가?
: 프로퍼티를 밖에서 참조하거나 변경하지 못하게 하는 것
- 정보 은닉을 왜 구현하는가?
: 외부에 공개할 필요가 없는 프로퍼티는 최대한 공개하지 않는 것이 바람직하기 때문
: 만약 공개할 필요가 없는데 공개하면 함수가 무엇을 의미하는지, 재사용해야 하는지 등 고민하기 때문에 협업 시 다른 개발자에게 혼란을 야기할 수 있음
- 클로저를 통해 정보 은닉을 구현하는 보편적인 방법에는 어떤 것이 있는가?
: 즉시 실행 함수의 지역 변수로서 자유 변수를 사용하여 구현할 수 있음
- 자유 변수란 무엇인가?
: 클로저에 의해 참조되는 상위 스코프의 변수를 의미함
- 자바스크립트는 클로저를 통해 정보 은닉을 완벽하게 구현할 수 있는가?
: 자바스크립트는 클래스 기반 객체지향 프로그래밍 언어가 아니기 때문에 접근 제한자가 구현되어 있지 않음
: 그래서 자바스크립트 프로퍼티의 접근제한자는 기본적으로public
, 즉 외부에 공개되어 있음
: 인스턴스 메서드를 사용하여 자유 변수를 통해private
을 흉내는 낼 수 있지만 여러 개의 인스턴스를 생성할 경우 또 다른 문제가 발생함
: 프로토타입 메서드를 사용하면 애초에 상태를 유지하지 못하기 때문에 정보 은닉을 구현할 수 없음
: 2022년부터 클래스에private
필드를 정의할 수 있는 표준 사양이 제안되기는 했음, 그러나 그 하위 버전에서는 정보 은닉을 완벽하게 구현할 수 없음