1. 일급객체의 조건
- 무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성 가능
- 변수나 자료구조에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
자바스크립트의 함수는 모두 만족하므로... 일급객체다!
함수가 일급객체다... 라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미이다.
객체는 값이기 때문에 함수는 값과 동일하게 취급할 수 있다.
따라서... 함수는 값을 사용할 수 있는 어디서든지 리터럴로 정의할 수 있고 런타임에 함수 객체로 평가된다.
하지만 일급객체로서 함수가 가지는 가장 큰 특징은 일반 객체와 같이 함수이ㅡ 매개변수에 전달할 수 있으며 함수의 반환값으로도 사용할수도 있다는 것이다.
2. 함수 객체의 프로퍼티
함수는 객체이므로 프로퍼티를 가진다.
2-1. arguments 프로퍼티
- arguments 객체는 함수가 호출될 때 전달된 인수(arguments)들을 담고 있는 유사 배열 객체이다.
- 순회가능한 유사배열 객체이며 함수 내부에서 지역 변수처럼 사용이 된다.
- 모든 함수 내부에서 사용할 수 있으며, 함수가 선언된 매개변수 외에 추가적으로 전달된 인수들도 확인할 수 있다=> 하지만 외부에서는 사용이 될 수 없다.
- 함수의 매개변수와 인수의 개수가 일치하는지 확인하지 않기 때문에 함수 호출시에 매개변수 개수만큼 인수를 전달하지 않아도 에러가 발생하지 않는다.
function sum() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
console.log(sum(1, 2, 3, 4)); // 10
arugments 객체는 인수를 프로퍼티 값으로 소유하며 프로퍼티 키는 인수의 순서를 나타낸다.
선언된 매개변수의 개수와 함수를 호출할 때 전달하는 인수의 개수를 확인하지 않는 특성 때문에
함수가 호출되면 인수 개수를 확인하고 이에 따라 함수의 동작을 달리 정의할 피룡가 있을 수 있다.
이때 유용하게 사용되는 것이 argtuments
2-2. Callar 프로퍼티
- caller 프로퍼티는 현재 실행 중인 함수가 어디에서 호출되었는지를 나타내는 참조를 반환한다.
- 즉, 호출한 함수(또는 호출 컨텍스트)를 가리킨다.
- 함수 객체의 Callar 프로퍼티는 함수 자신을 호춣한 함수를 가리킨다.
function foo() {
console.log('foo called by:', foo.caller);
}
function bar() {
foo();
}
bar(); // foo called by: function bar() { foo(); }
2-3. length 프로퍼티
- length 프로퍼티는 함수를 정의할 때 선언한 매개변수의 개수를 나타낸다.
- 이는 함수가 정의될 때 지정된 매개변수의 개수를 의미하며, 함수가 실제로 호출될 때 전달된 인수의 개수와는 무관하다.
function add(a, b) {
return a + b;
}
function subtract(a, b, c) {
return a - b - c;
}
console.log(add.length); // 2
console.log(subtract.length); // 3
🤔 엇 이건 알아두잣 ..!
arguments 객체의 length 프로퍼티와 함수 객체의 length 의 값은 다를 수 있다.
arguments 객체의 length 프로퍼티는 인자의 개수를 가리키고
함수 객체의 Length 프로퍼티는 매개변수의 개수를 가리키게 된다.
2-4. name 프로퍼티
- name 프로퍼티는 함수의 이름을 나타낸다.
- 함수 선언문에서 사용된 이름을 반환하며,
- 익명 함수의 경우 빈 문자열을 반환한다.
- 만약 익명 함수 자체를 정의했다면, name 프로퍼티는 빈 문자열("")을 반환하게 된다.
- 함수를 호출할 때는 함수 이름이 아닌 함수 객체를 가리키는 식별자로 호출한다.
function multiply(a, b) {
return a * b;
}
const divide = function(a, b) {
return a / b;
};
console.log(multiply.name); // "multiply"
console.log(divide.name); // "divide"
2-5._ _proto__ 접근자 프로퍼티
- 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
- 내부 슬롯에 직접 접근할 수 없으며 __proto__ 접근자 프로퍼티를 통해 간접적으로 프로토타입 객체에 접근할 수 있다.
const animal = {
eats: true,
walk() {
console.log("Animal is walking");
}
};
const rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // rabbit이 animal을 상속받도록 설정
console.log(rabbit.eats); // true (animal에서 상속받은 프로퍼티)
rabbit.walk(); // "Animal is walking" (animal에서 상속받은 메서드)
* prototype 프로퍼티는 함수가 객체를 생성하는 생성자 함수로 호출될 때 생성자 함수가 생성할 인스턴스의 프로토타입 객체를 가리킨다.
'Deep Dive 정리' 카테고리의 다른 글
[JS Deep Dive] 19장 - 프로토타입 (0) | 2024.09.11 |
---|---|
[JS Deep Dive] 21장 - 빌트인객체 (0) | 2024.09.10 |
[JS] this 조금 더 정리하기 (0) | 2024.09.04 |
[JS Deep Dive] 17장 - 생성자 함수에 의한 객체 생성 (0) | 2024.09.04 |
[JS Deep Dive] 16장 - 프로퍼티 어트리뷰트 (0) | 2024.09.01 |