일급객체
자바스크립트의 함수는 일급 객체이다!
- 무명의 리터럴로 생성할 수 있으므로 런타임에 생성이 가능하다.
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다
- 함수의 반환값으로 사용할 수 있다.
//1. 함수는 무명의 리터럴로 생성 가능 //2. 함수는 변수에 저장할 수 있다. const increase = function (num) { return ++num; } const decrease = function (num) { return --num; } //2. 함수는 객체에 저장할 수 있다 const auxs = { increase, decrease }; //3. 함수는 매개변수에 전달할 수 있다. //4. 함수는 함수의 반환 값으로 사용할 수 있다. function makeCouner(aux){ let num = 0; return function() { num = aux(num); return num; } } const increaser = makeCounter(auxs.increase);
- 함수와 객체의 차이점
함수=일급객체 → 함수를 객체와 동일하게 사용할 수 있다.
but 일반 객체는 호출할 수 없지만 함수 객체는 호출할 수 없다!
함수 객체는 일반 객체에는 없는 함수 고유의 프로퍼티를 소유한다.
함수 객체의 프로퍼티
함수도 객체이므로 프로퍼티를 가질 수 있다


- arguments
- 함수 호출시 전달된 인수(argument)의 정보를 담고 있는 순회 가능한 유사배열객체
- 함수 내부에서 지역 변수처럼 사용된다
- 함수 외부에서 참조할 수 없다.
- 인수를 프로퍼티 값으로 소유, 키는 인수의 순서
- callee: 함수 자신
- length: 인수의 개수
프로퍼티의 값은 arguments 객체

함수가 호출되면 함수 몸체 내에서 암묵적으로 매개변수가 선언되고 undefined로 초기화된 이후 인수가 할당됨
선언된 매개변수의 개수보다 인수를 적게 전달했을 경우, 인수가 전달되지 않은 매개변수는 undefined로 초기화된 상태 유지, 매개변수의 개수보다 인수를 더 많이 전달할 경우 초과된 인수는 무시됨(버려지지 않고, 프로퍼티로 보관된다)
매개 변수 개수를 확정할 수 없는 가변인자 함수를 구현할 때 유용
function sum(){ let res = 0; for(let i = 0; i < arguments.length; i++){ res += arguments[i]; } return res; } console.log(sum(1,2,3)); //6
유사배열 객체 → length프로퍼티를 가진 객체, for문으로 순회 가능 but 배열이 아니므로 배열 메서드 사용시 에러가 발생
→
Function.prototype.call
, Function.prototype.apply
간접 호출⇒ rest 파라미터(ES6 도입)
function sum(...args) { return args.reduce((pre, cur) => pre + cur, 0); } console.log(1,2,3); //6
- caller
ECMAScript 사양에 포함되지 않은 비표준 프로퍼티
함수 자신을 호출한 함수를 가리킨다
function foo(func) { return func(); } function bar(){ return bar.caller } console.log(foo(bar)); //function foo(func){...} console.log(bar()); //null
- length
함수를 정의할 때 선언한 매개변수의 개수를 가리킨다.
function foo() {} console.log(foo.length); //0 function bar(x) { return x; } console.log(bar.length); //1
arguments객체의 length 프로퍼티의 값과 다를 수 있다.
arguments 객체의 length 프로퍼티 - 인자(aragument)의 개수
함수 객체의 length 프로퍼티 - 매개변수(parameter)의 개수
- name
함수 이름을 나타내는 프로퍼티
//기명함수 표현식 var namedFunc = function foo() {}; console.log(nameFunc.name); //foo //익명함수 표현식 var anonymousFunc = function() {}; //ES5: name 프로퍼티는 빈 문자열을 값으로 갖는다. //ES6: name 프로퍼티는 함수 객체를 가리키는 변수 이름을 값으로 갖는다. console.log(anonymousFunc.name); //anonymousFunc //함수 선언문 function bar() {} console.log(bar.name); //bar
- __proto__
내부슬롯(Prototype)이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자 프로퍼티
모든 객체는 [[Prototype]]이라는 내부 슬롯을 가진다 → 객체 지향 프로그래밍의 상속을 구현하는 프로토타입 객체
- prototype
생성자 함수로 호출할 수 있는 함수 객체인 constructor만이 소유하는 프로퍼티

prototype 프로퍼티는 함수가 객체를 생성하는 함수로 호출될 때 생성자 함수가 생성할 인스턴스의 프로토타입 객체를 가리킨다.