
일급 객체의 조건
- 무명의 리터럴로 생성할 수 있다, 즉 런타임에 생성이 가능하다.
- 변수나 자료구조에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
// 1. 함수는 무면ㅇ의 리터럴로 생성할 수 있다
// 2. 함수는 변수에 저장할 수 있다
// 런타임에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당된다
const increase = function (num) {
return ++num;
};
const decreas = function (num) {
return --num;
};
// 2. 함수는객체에 저장할 수 있다
const predicates = { increase, decrease };
// 3. 함수의 매개변수에 전달할 수 있다
// 4. 함수의 반환값으로 사용할 수 있다
function makeCounter(predicate) {
let num = 0;
return function () {
num = predicate(num);
return num;
};
}
// 3. 함수의 매개변수에 전달할 수 있다
const increaser = makeCounter(predicates.increas);
console.log(increaser); // 1
console.log(increaser); // 2
// 3. 함수의 매개변수에 전달할 수 있다
const decreaser = makeCounter(predicates.decreas);
console.log(decreaser); // 1
console.log(decreaser); // 2
- 함수가 일급 객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미다.
- 객체는 값이 동일하므로 함수는 값과 동일하게 취급할 수 있다.
- 함수는 값을 사용할 수 있는 곳이라면 어디서든지 리터럴로 정의할 수 있으며 런타임에 함수 객체로 평가된다.

- `arguments`, `caller`, `length`, `name`, `prototype` 프로퍼티는 함수 객체 고유의 데이터 프로퍼티다.
argument 프로퍼티
- 함수 객체의 `arguments` 프로퍼티 값은 arguments 객체다.
- `arguments` 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 간으한 유사 배열 객체이며 함수 내부에서 지역 변수처럼 사용된다.
- 함수 외부에서는 참조할 수 없다.
function multiply(x, y) {
console.log(arguments);
return x * y;
}
console.log(multiply()); // NaN
console.log(multiply(1)); // NaN
console.log(multiply(1, 2)); // 2
console.log(multiply(1, 2, 3)); // 2

- `arguments` 객체는 매개변수 개수를 확정할 수 없는 가변 인자 함수를 구현할 때 유용하다.
- `arguments` 객체는 배열 형태로 인자 정보를 담고 있지만 실제 배열이 아닌 유사 배열 객체다.
💡 유사 배열 객체란 `length` 프로퍼티를 가진 객체로 `for` 문으로 순회할 수 있는 객체를 말한다.
function sum() {
let result = 0;
for(let i = 0; i< arguments.lentgh; i++) {
result += arguments[i];
}
return result;
}
sum(1,2);// 3
sum(1,2,3);// 6
sum(1,2,3,4,5);// 15
sum(1,2,3,4,5,6,7,8,9,10);// 55
caller 프로퍼티
- 함수 객체의 `caller`프로퍼티는 함수 자신을 호출한 함수를 가리킨다.
function foo(cb) {
return cb();
}
function bar() {
return 'caller : ' + bar.caller;
}
console.log(foo(bar));// caller : function foo(cb) {...}
console.log(bar());// caller : null
length 프로퍼티
- 함수 객체의 `length` 프로퍼티는 함수를 정의할때 선언한 매개변수를 가리킨다.
- `arguments` 객체의 `length` 프로퍼티 인자의 개수를 가리키고
- 함수 객체의 `length` 프로퍼티는 매개변수의 개수를 나타낸다.
function foo() {}
console.log(foo.lentgh); //0
function bar(x) {
return x;
}
console.log(bar.lentgh); // 1
function baz(x, y) {
return x * y;
}
console.log(baz.lentgh); // 2
name 프로퍼티
- 함수 객체의 name 프로퍼티는 함수 이름을 나타낸다.
// 기명 함수 표현식
var naemedFunc = function foo() {};
console.log(naemedFunc.name); //foo
// 익명 함수 표현식
var anonymousFunc = function() {};
console.log(anonymousFunc .name); //anonymousFunc
// 함수 선언문
function bar() {}
console.log(bar.name) // bar
__proto__ 접근자 프로퍼티
- 모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖는다.
- [[Prototype]] 내부 슬롯은 상속을 구현하는 프로토타입 객체를 가리킨다.
- `__proto__` 프로퍼티는 [[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티다.
prototype 프로퍼티
- 생성자 함수로 호출할 수 있는 함수 객체, 즉 constructror만이 소유하는 프로퍼티다.
- 일반 객체와 생성자 함수로 호출할 수 없는 non-constructor에는 `prototype` 프로퍼티가 없다.
참고
모던 자바스크립트 Deep Dive : 네이버 도서
네이버 도서 상세정보를 제공합니다.
search.shopping.naver.com
'Javascript' 카테고리의 다른 글
[모던자바스크립트 Deep Dive] 19장 프로토타입 1 (0) | 2024.12.16 |
---|---|
[모던 자바스크립트 Deep Dive] 17장 생성자 함수에 의한 객체 생성 (0) | 2024.11.21 |
[모던 자바스크립트 Deep Dive] 16장 - 프로퍼티 어트리뷰트 (2) | 2024.11.20 |
[모던 자바스크립트 Deep Dive] 15장 - let, const 키워드와 블록 레벨 스코프 (1) | 2024.11.18 |
[모던 자바스크립트 Deep Dive] 14장 전역변수의 문제점 (2) | 2024.11.15 |