● 일급객체
다음과 같은 조건을 만족하는 객체를 일급 객체라 한다.
- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성 가능하다.
- 변수나 자료구조에 저장할 수 있다. (객체, 배열)
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
● 함수 객체의 프로퍼티
함수도 객체이다. 함수도 프로퍼티를 가질 수 있다.
아래와 같이 square라는 함수가 있다고 가정해보자. square라는 함수는 함수이기때문에, Function.prototype의 모든 메서들을 상속받아 사용할 수 있다. 또한 Function.prototype의 prototype으로는 Object.prototype이기때문에 Object.prototype의 메서들을 모두 사용할 수 있음..!!!! 대박!!
Object.getPrototypeOf(nameOne) === Function.prototype // true
Object.getPrototypeOf(Function.prototype) === Object.prototype // true
function square(number) {
return number * number;
}
arguments, caller, length, name, __proto__ 등 모두 상속받은 메서드이기 때문에, 함수에서 활용할 수 있는 것이다•••
⚬ arguments 프로퍼티
- arguments 프로퍼티는 순회가 가능한 유사배열 객체다.
ES6 이전에는 argument들을 불러오기 위해 Function.prototype.call, Function.prototype.apply를 사용해 간접 호출해야하는 번거로움이 있었으나.. Rest 파라 미터가 생겨서 해결됐다.
function solution() {
// 배열의 메서드를 사용하기 위해, slice를 간접호출함, arguments들을 배열로만듦.
const array = Array.prototype.slice.call(arguments)
console.log(array)
}
solution("daeun", "kim"); // [ 'daeun', 'kim' ]
ES6 생긴 뒤
function solution() {
console.log(arguments);
}
solution("daeun", "kim"); // [Arguments] { '0': 'daeun', '1': 'kim' }
function solution(...args) {
console.log(args);
}
solution("daeun", "kim"); // [ 'daeun', 'kim' ]
⚬ length 프로퍼티
- 함수 매개변수의 개수를 가르킨다.
- arguments의 length 프로퍼티의 값과 함수의 length 프로퍼티 값은 다를 수 있다.
⚬ name 프로퍼티
ES6이전까지는 비표준이었으나, 함수 객체를 가르키는 식별자를 값으로 갖는다.
function solution(...args) {
console.log(args);
}
const nameOne = function name(){}
// name : "name"
const nameTwo = function(){}
// name : "nameTwo"
function nameThree(){}
// name : "nameThree"
- 함수 표현식은 함수를 정의한 이름으로 표시됨, 무명함수면 변수명으로 지정됨
- 함수 정의는 그 함수의 이름으로 지정됨