26.1 함수의 구분
- ES6 이전 함수는 동일한 함수로 다양한 형태로 호출 가능 (일반 함수, 생성자 함수, 메서드)
- 사용 목적에 따라 명확히 구분 안됨
- ES6 이전 모든 함수는 callable 이면서 constructor (객체에 바인딩된 함수, 콜백 함수도 포함)
- constructor => 객체에 바인딩된 함수가 prototype 프로퍼티 가지고, 프로토타입 객체도 생성하는 문제 발생
- ES6 이전 메서드는 프로퍼티 값으로 익명 함수 표현식 할당하는 형태임
- ES6에서 함수를 사용 목적에 따라 세가지 종류로 명확히 구분함
- 일반 함수(함수 선언문, 함수 표현식); constructor O, prototype O, super X, arguments O
- 메서드; constructor X, prototype X, super O, arguments O
- 화살표 함수; constructor X, prototype X, super X, arguments X
26.2 메서드
- ES6 사양, 메서드는 메서드 축약 표현으로 정의된 함수만을 의미함
- 인스턴스 생성 불가능한 non-constructor (생성자 함수로서 호출 불가)
- prototype 프로퍼티 없고 프로토타입도 생성 X
- 자신을 바인딩한 객체를 가리키는 내부 슬롯 [[HomeObject]] 가짐
- super 키워드 이용하여 super 클래스의 메서드 참조 가능
- 표준 빌트인 객체가 제공하는 프로토타입 메서드, 정적 메서드 모두 non-constructor
26.3 화살표 함수
- 콜백 함수 내부 this가 전역 객체 가리키는 문제 해결 대안으로 유용
- 화살표 함수 정의
- 함수 정의; 함수 표현식으로 정의
- 매개변수 선언; 매개변수 1개이면 소괄호 생략 가능, 여러 개면 생략 불가
- 함수 몸체 정의
- 하나의 문이면 중괄호 생략 가능, 표현식인 문이면 암묵적으로 반환 (아니면 에러 발생)
- 객체 리터럴 반환 시에는 소괄호로 감싸 주어야 함
- 즉시 실행 함수로도 사용 가능
- 콜백 함수로서 정의할 때 유용, this도 편리하게 설계됨
- 화살표 함수와 일반 함수의 차이
- 화살표 함수는 인스턴스 생성 불가능한 non-constructor (생성자 함수로서 호출 불가)
- 중복된 매개변수 이름 선언 불가
- 화살표 함수는 함수 자체의 this, arguments, super, new.target 바인딩 갖지 않음
- 스코프 체인을 통해 상위 스코프의 this, arguments, super, new.target 참조함
- this
- 함수 호출 방식에 따라 this에 바인딩할 객체가 동적으로 결정됨
- 클래스 내부 모든 코드에는 strict mode가 암묵적으로 적용됨
- 화살표 함수는 함수 자체의 this 바인딩 갖지 않음
- 화살표 함수 내부에서 this 참조 시 상위 스코프의 this 그대로 참조 (lexical this)
- 프로퍼티에 할당한 화살표 함수도 스코프 체인 상에서 가장 가까운 상위 함수 중에서
화살표 함수가 아닌 함수의 this 참조
- 객체 리터럴 내에서는 ES6 메서드 축약 표현 사용 권장
- 프로토타입 객체의 프로퍼티에는 일반 함수 할당
- 클래스에서 클래스 필드에 할당한 화살표 함수 내부의 this는 클래스가 생성한 인스턴스 가리킴,
하지만 인스턴스 메서드가 됨
- 클래스에서 메서드 정의시에는 ES6 메서드 축약 표현 사용 권장
- super
- 화살표 함수 내부에서 super 참조 시 상위 스코프의 super 참조
- 화살표 함수의 super는 상위 스코프인 constructor의 super 가리킴
- arguments
- 화살표 함수는 함수 자체의 arguments 바인딩 갖지 않음
- 상위 스코프의 arguments 참조
- 전역 객체에는 arguments 존재 X (함수 내부에서만 유효)
- 화살표 함수로 가변 인자 함수 구현 시에는 반드시 Rest 파라미터 사용!
26.4 Rest 파라미터
- 기본 문법
- function fn (...args) { }
- 함수에 전달된 인수들의 목록을 배열로 전달 받음
- 파라미터 마지막 순서로 와야 함
- 단 하나만 선언 가능
- 함수 객체의 length 프로퍼티에는 영향 주지 않음
- Rest 파라미터와 arguments 객체
- arguments 객체
- 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체
- 함수 내부에서 지역 변수처럼 사용 가능
- 배열 메서드 사용 위해서는 call이나 apply 메서드 사용해야 함
- Rest 파라미터
- 배열 메서드 사용 가능
26.5 매개변수 기본값
- JS 엔진은 매개변수의 개수와 인수의 개수 체크하지 않음 (에러 발생 X)
- ES6 매개변수 기본값 세팅 가능
- 매개변수 기본값은 매개변수에 인수 전달하지 않은 경우와 undefined 전달한 경우에만 유효
- Rest 파라미터에는 기본값 지정 불가
- 매개변수 기본값은 함수 객체의 length 프로퍼티와 arguments 객체에 영향 주지 않음
'Books > 모던 JS Deep Dive ✔️' 카테고리의 다른 글
[모던 JS Deep Dive] 28장 - Number (0) | 2022.01.15 |
---|---|
[모던 JS Deep Dive] 27장 - 배열 (0) | 2022.01.14 |
[모던 JS Deep Dive] 25장 - 클래스 (0) | 2022.01.10 |
[모던 JS Deep Dive] 24장 - 클로저 (0) | 2022.01.06 |
[모던 JS Deep Dive] 23장 - 실행 컨텍스트 (0) | 2022.01.04 |
댓글