다음과 같은 조건을 만족하는 객체를 일급 객체
라고 합니다.
- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
- 함수는 변수에 저장할 수 있다.
- 함수의 매개변수에 전달 할 수 있다.
- 함수의 반환값으로 사용될 수 있다.
const increase = function(num){
return ++num;
};
const decrease = function (num){
return --num;
};
// 함수는 객체에 저장할 수 있다.
const auxs = {increase, decrease}
//3. 함수의 매개변수에 전달할 수 있다.
//4. 함수의 반환값으로 사용할 수 있다.
function makeCounter(aux){
let num = 0;
return funtion () {
num = aux(num)
return num;
}
}
//3. 함수의 매개변수에게 함수를 전단할 수 있다.
const increaser = makeCounter(auxs.increase);
console.log(increaser());
console.log(increaser());
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser());
console.log(decreaser());
자바스크립트의 함수는 객체 타입의 값
입니다. 자바스크립트의 함수는 값처럼 변수에 할당할 수 있고, 프로퍼티 값이 될 수도 있으며, 함수가 일급 객체라는 것은 함수를 값처럼 자유롭게 사용할 수 있다는 의미입니다.
따라서, 함수 리터럴로 생성한 함수 객체를 변수에 할당할 수 있습니다. 이러한 함수 정의 방식을 함수 표현식이라고 합니다.
var add = function (x, y) {
return x + y;
};
console.log(add(2,5));
함수 리터럴의 함수 이름 생략할 수 있습니다. 이러한 함수를 익명 함수라고 합니다.
함수 표현식의 함수 리터럴은 함수 이름을 생략하는 것이 일반적입니다.
var add = function foo(x, y){
return x + y ;
};
console.log(add(2,5))
// 함수 객체를 가리키는 식별자로 호출
console.log(foo(2,5));
//함수 이름으로 호출하면 Reference Error가 발생.
//함수 이름은 함수 몸체 내부에서만 유효한 식별자.
console.log(foo(2,5));
//ReferenceError : foo is not defined