chapter 18 : 함수와 일급 객체
일급 객체
- 무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성 가능
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
js의 함수는 이를 모두 만족하므로 일급 객체다.
일반 객체 vs 함수
- 함수는 호출가능, 일반 객체는 불가능
- 함수 객체는 함수 고유의 프로퍼티를 소유한다.
함수 객체의 프로퍼티
aruguments, caller, length, name, prototype을 가진다
arguments 프로퍼티
- 프로퍼티 값은 arguments 객체, 호출 시 인수들의 정보를 담고 있는 내부 참조가 가능한 iterable 유사 배열 객체
- ES3 이후로 폐지, arguments 객체를 참조하도록 하자.
- 함수의 매개변수와 인수의 개수가 일치하는지 js는 확인안하므로 숫자가 달라도 에러 x
- 인수를 적게 전달할 경우 전달 못받은 매개변수는 undefined, 초과 시에는 무시
- 매개변수 개수를 확정할 수 없는 가변 인자 함수 구현시 유용
- ES6에 Rest 파라미터 도입으로 사용이 줄어듬
caller 프로퍼티
- ECMAScript 사양에 포함되지 않은 비표준 프로퍼티
- 함수 자신을 호출한 함수를 가리키는 프로퍼티
length 프로퍼티
name 프로퍼티
- 함수 이름을 나타냄
- ES6부터 정식 표준
- ES5와 ES6의 동작이 다름. 익명 함수 표현식의 경우 ES5는 빈 문자열, ES6는 함수 객체를 가리키는 식별자를 값으로 가짐.
es6 ex)
var anonymousFuc = function {};
console.log(anonymousFunc.name);
proto 접근자 프로퍼티
- [[Prototype]]이라는 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
- 직접접근 불가,
__proto__
를 통한 간접접근만 가능
prototype 프로퍼티
- non-constructor에는 prototype이 없음.