일급 객체란?
일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
일급 객체의 조건
- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
- 변수나 자료구조에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
이렇게 조건만 본다면 일급객체가 뭔지 어렵지만 함수란 의미입니다. 자바스크립트에서 함수는 일급 객체입니다.
함수 객체의 프로퍼티
함수는 객체이므로 프로퍼티가 존재합니다. 브라우저 콘솔창에서 console.dir메서드로 확인이 가능합니다.
IDE에서 getOwnPropertyDescriptors메세드로 확인이 가능합니다.
function add(number){
return number * number;
}
console.log(Object.getOwnPropertyDescriptors(add));
/**
{
length: { value: 1, writable: false, enumerable: false, configurable: true },
name: {
value: 'add',
writable: false,
enumerable: false,
configurable: true
},
arguments: {
value: null,
writable: false,
enumerable: false,
configurable: false
},
caller: {
value: null,
writable: false,
enumerable: false,
configurable: false
},
prototype: { value: {}, writable: true, enumerable: false, configurable: false }
}
*/
arguments 프로퍼티
aguments는 함수 호출시 전달된 인수들의 정보를 담고 있는 유사배열 객체입니다.
자바스크립트는 함수의 매개변수와 인수의 개수를 확인하지 않으므로 꼭 개수를 맞추지 않아도 에러가 발생하지 않습니다.
함수가 호출이 되면 자동으로 arguments는 undefined로 초기화가 이후에 할당이 됩니다. 만약 함수에서 지정한 매개변수보다 인수가 적게 전달이 된다면 undefined 상태가 유지가 되면 갯수가 초과될 경우 무시가 되지만 버려지는건 아니므로 arguments에 담겨서 저장이 됩니다.
function add(number){
console.log(arguments);
return number * number;
}
console.log(add(2,2,2));
/**
[Arguments] { '0': 2, '1': 2, '2': 2 }
4
*/
만약 함수의 매개변수 갯수를 유동적으로 사용할 경우 유용하지만 arguments는 유사객체이므로 배열 메서드를 사용하면 에러가 발생합니다. 그럴 때 ES6에서 제공되는 Rest 파라미터를 사용하면 됩니다.
function add(...arg){
return arg.reduce((pre,cur)=>pre+cur,0);
}
console.log(add(1,2,3,4,5)); // 15
caller 프로퍼티
caller 프로퍼티는 함수 자신을 호출한 함수를 가키립니다.
function foo(fnc){
return fnc();
}
function bar(){
return `caller : `+bar.caller;
}
console.log(foo(bar));
console.log(bar());
/**
caller : function foo(fnc){
return fnc();
}
caller : null
*/
length 프로퍼티
length는 함수를 정의했을 때 선언한 매개변수의 갯수를 반환합니다.
arguments객체의 length는 인자의 개수를 반환하고 함수객체의 length는 매개변수의 갯수를 반환합니다.
name 프로퍼티
함수 객체를 가리키는 식별자를 값으로 갖는다.
var sums = function foo(){};
console.log(sums.name); // foo
var func = function(){};
console.log(func.name); // func
function bar(){};
console.log(bar.name); // bar
'javascript' 카테고리의 다른 글
프로토 타입 체인 (0) | 2024.06.30 |
---|---|
Prototype (0) | 2024.06.30 |
객체 변경 방지 (0) | 2024.06.28 |
Property Attribute (0) | 2024.06.27 |
Dynamic Scope, Static Scope (0) | 2024.06.26 |