javascript에선 매우 특별하게 대우를 받는 일급객체
함수를 다른함수에 인자로 제공하거나,
함수가 함수를 반환할 수 있으며,
변수에도 할당할 수 있다
즉 함수를 변수에 할당할 수 있기 때문에, 함수를 배열의 요소나 객체의 속성값으로 저장할 수 있다 또한 함수를 데이터(문자열, 숫자, 불린, 배열, 객체 등등,,,)처럼 다룰 수 있다
// 함수표현식으로 사용한 경우
const a = function (num) {
return num * num
}
// 화살표함수로 사용한 경우
const a = (num) => { return num * num }
//
const a = (num) => { return num* num }
// num2는 매개변수로 사용
const b = (num2, num3) => { return num2(num3) }
let result = b(a, 2); // 4 출력
const a = (num1) => { return (num2) => { return num1 * num2 }}
// a(2)(3) 6출력
고차함수역시 함수를 전달인자로 받을 수 있고, 함수를 리턴할 수 있는 함수이다
다른 함수(caller)의 전달인자(argument)로 전달되는 함수를
콜백함수(callback function)라고 한다
콜백 함수는 전달받은 고차 함수(caller)는, 함수 내부에서 이 콜백 함수를 호출(invoke)할 수 있고, 조건에 따라 콜백 함수의 실행 여부를 결정할 수 도있다.
함수를 리턴하는 함수는 모양새가 특이한 만큼, 커링함수 라고도 한다
따로 커링함수를 사용하는 경우에는 고차함수 라는 용어를 '함수를 전달인자로 받는 함수'에만 한정해 사용하기도 한다
즉, 고차함수가 커링함수이기도 하다
// 간략한 예시
let double = (num) => { return num * 2 }
let doubleAdder = (added, func) => {
const doubled = func(added);
return (num) => { return num + doubled }
}
/*
* 함수 doubleAdder는 고차 함수입니다.
* 함수 doubleAdder의 인자 func는 함수 doubleAdder의 콜백 함수입니다.
* 함수 double은 함수 doubleAdder의 콜백으로 전달되었습니다.
*/
// doubleAdder(5, double)는 함수이므로 함수 호출 기호 '()'를 사용할 수 있습니다.
doubleAdder(5, double)(3); // -> 13
// doubleAdder가 리턴하는 함수를 변수에 저장할 수 있습니다. (일급 객체)
const addTwice3 = doubleAdder(3, double);
addTwice3(2); // --> 8