-
Notifications
You must be signed in to change notification settings - Fork 2
[정리] 3주차, 20~25
Q.
표준 빌트인 객체는 내장된 정적 메서드를 이용할 수 있다.
객체가 아닌 원시타입도 정적 메서드를 이용할 수 있는데, 어떻게 가능한걸까?
const food = 'kimbob';
console.log(food.length); // 6
A.
JS엔진이 원시값을 래퍼객체(임시객체)로 변환해 해당 메서드를 호출하는 방식으로 이루어진다.
*메서드를 수행한 후, 다시 원시값을 되돌린다.
동작원리
마침표 접근자 접근 → 래퍼 객체 생성 & 내부슬롯에 원시값 할당됨 → 호출한 메서드 수행 → 원시값으로 되돌림 → 래퍼객체 식별자 x → 가비지 컬렉션대상
전역객체
표준 빌트인 객체, 호스트 객체, 전역 변수(var 키워드)와 전역함수를 프로퍼티로 가지는, 최상위 객체.
- 객체의 계층구조상 최상위에 위치함.(상속관계랑 관련 x)
- let, const 키워드로 생성된 전역 변수는 포함 x → 전역객체로 접근 불가.
- 브라우저 환경에선
window
, node.js에선global
.
- JS엔진에 의해 암묵적으로 생성되며, 함수 호출 시 함수 내부로 전달된다.
- 함수 호출방식에 따라 this 바인딩이 동적으로 결정된다.
-
일반함수(중첩,콜백함수 포함)
- 전역객체
-
메서드 호출
- 메서드를 호출한 객체
-
생성자 함수 호출
- 생성자 함수가 생성한 인스턴스
const lunchMenu = {
menu_name: 'pizza',
answer(callback) {
setTimeout(callback, 100); // setTimeout(callback.bind(this), 100);
}
}
lunchMenu.answer(function () {
console.log(`Today's lunch menu is ${this.menu_name}!!`); // undefined
})
메서드를 호출한 객체의 this는 객체와 연결되어있다.
하지만 일반함수인 콜백함수는 전역객체와 연결되어있기에 undefined
이 나온다.
용어정의
- 실행컨텍스트 스택
: 스택 자료구조로 코드의 실행순서를 관리한다. - 렉시컬 환경
: 실행 컨텍스트의 컴포넌트
- 환경레코드 : 스코프 내 식별자와 식별자에 바인딩된 값을 관리하는 저장소.
- 외부렉시컬 참조 : 참조할 상위 렉시컬 환경.
동작원리
- 전역 실행 컨텍스트 생성한 뒤, 전역 렉시컬 환경을 생성해 실행 컨텍스트에 바인딩한다.
- 전역 렉시컬 환경의 환경레코드를 생성한 뒤, this를 바인딩한다.
- 전역 렉시컬 환경에서 참조할 상위 렉시컬 환경을 결정한다.
- 이제 비로소 !! 전역 코드를 실행한다.
렉시컬 스코프: 함수정의가 평가된 시점을 기준으로 상위 스코프가 결정되는 것.
함수가 평가될 때, 자신이 정의된 위치에 의해 결정된 상위 스코프를 [[Environment]]
내부슬롯에 저장한다.
해당 스코프에 찾는 프로퍼티가 없을 때, 기억해둔 상위스코프로 가서 검색한다.
function add(a) {
function getNumber() {
let b = prompt(`더할 숫자를 입력하세요`);
}
return a + b;
}
getNumber
의 상위스코프는, 해당 함수가 정의된 add 스코프
가 된다.
add
의 상위스코프는, 전역스코프에 정의되었기에 전역스코프
가 된다.
클로저 동작방식
외부함수의 반환값으로 중첩함수를 받아, 스코프 체인을 통해 외부 함수를 참조할 수 있다.
또한, 내부슬롯[[Environment]]
을 통해 외부함수를 참조하고 있기에 외부함수의 렉시컬 환경이 소멸하지 않는다.
*다만, 실행컨텍스트 스택에서는 외부함수 제거가 이루어진다.
클래스 호이스팅
let, const
호이스팅과 동일 - 런타임 이전에 클래스가 선언되지만, 정의 전까지 접근할 수 없다.
클래스 특징
- 클래스는 함수로 평가된다.
-
constructor
- 최대 1개 존재, 제일 처음 호출된다.
- 별도의 반환문 없어야한다. (암묵적으로 this 반환됨)
- class 내부에서 정의한 메서드는 기본적으로 프로토타입 메서드로 작동한다.
- 클래스 메서드(=정적메서드)는 인스턴스를 생성하지 않아도 호출 할 수 있다.
- 정적 메서드를 생성하기 위해선
static
키워드를 메서드 앞에 붙이면 된다.
- 정적 메서드를 생성하기 위해선
- 클래스 상속
extends
- 서브클래스에서 constructor을 생략하지 않는 경우, 서브클래스 constructor에 반드시 super을 호출해야한다.
*실제로 인스턴스를 생성하는 주체는 수퍼클래스이기때문에, super을 호출하지 않으면 인스턴스를 생성할 수 없다.
- 서브클래스에서 constructor을 생략하지 않는 경우, 서브클래스 constructor에 반드시 super을 호출해야한다.