18장 모던 자바스크립 함수와 일급 객체
일급객체
<조건>
무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성이 가능하다
변수난 자료구조(객체,배열 등)에 저장할 수 있다
함수의 매개변수에 전달할 수 있다
함수의 반환값으로 사용할 수 있다
//1.함수는 무명의 리터럴로 생성할 수 있다.
//2.함수는 변수에 저장할 수 있다.
const increase = function (num) {
return ++num;
};
const decrease = function (num) {
return --num;
}
//2.함수는 객ㅊ체에 저장할 수 있다.
const auxs = {increase, decrease};
//3.함수는 매개변수에 전달할 수 있다.
function makeCounter(aux) {
let num = 0;
return function () {
num = aux(num);
return num;
};
}
//3.함수는 매개변수에게 함수를 전달할 수 있다.
const increaser = makeCounter(auxs.increase);
console.log(increase()); // 1
console.log(increase()); // 2
const increaser = makeCounter(auxs.decrease);
console.log(decrease()); // -1
console.log(decrease()); // -2
함수는 객체와 동일하다
함수는 값을 사용할 수 있는 곳이라면 어디든 사용 가능
함수는 매개변수와 반환값으로 사용 가능
함수 객체의 프로퍼티
Object.getOwnPropertyDescriptors 메서드를 사용하면 함수의 프로퍼티 확인할 수 있다
arguments, caller, length, name, prototype은 함수 객체의 프로퍼티이지만
__proto__ 접근자 프로퍼티는 Object.prototype 객체로부터 상속받음
arguments
함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체이며,
함수 내부에서 지역 변수처럼 사용된다.
매개 변수가 부족하면 undefined로 더 많으면 초과된 인수는 무시(arguments에 저장)
매개 변수 개수를 확정할 수 없는 가변 인자 함수를 구현할때 유용
function sum() {
let res = 0;
for(let i = 0; i < arguments.length; i++) {
res += arguments[i];
}
return res;
}
console.log(sum()); //0
console.log(sum(1,2)); //3
console.log(sum(1,2,3)); //6
//배열은 아니기때문에 배열 메서드를 사용할려면 Function.prototype.call과 Function.prototype.apply를 사용해야한다
function sum() {
const array = Array.prototype.slice.call(arguments);
return array.reduce(function(pre, cur) {
return pre + cur;
},0);
}
// Rest 파라미터 사용
function sum(...args) {
return args.reduce((pre, cur) => pre + cur, 0);
}
caller 프로퍼티
함수 자신을 호출하는 함수
안씀
length 프로퍼티
함수를 정의할 때 선언한 매개변수의 개수를 가리킴
arguments 객체의 length 프로퍼티와 함수 객체의 length 프로퍼티의 값은 다를 수 있으므로 주의
name 프로퍼티
함수 이름을 의미
ES5에서 name 프로퍼티는 빈 문자열, ES6에서 함수 객체를 가리키는 식별자를 값으로 갖는다
var anony = function() {};
console.log(anony.name)
__proto__ 접근자 프로퍼티
[[Prototype]] 내부 슬롯이 가리키는 프로토타입 객체에 접근하기 위해 사용하는 접근자
프로퍼티다. 간접 접근용임
prototype 프로퍼티
생성자 함수로 호출할 수 있는 함수 객체, 즉 construtor만이 소유하는 프로퍼티다.
(function () {}).hasOwnProperty('prototype');//true
({}).hasOwnProperty('prototype');