함수의 형태로 리턴할 수 있는 함수.
함수를 인자로 전달 받을 수도 있고, 함수 자체를 리턴할 수 있다.
const add = (num: number) => {
return number++;
}
/**
* 다른 함수를 인자로 받는 고차함수
* @param func 현재 함수의 콜백 함수가 된다.
* @returns 콜백 함수가 실행되고 그 결과가 반환된다.
*/
const addNumber = (num: number, func: (num: number) => number) => {
return func(num);
}
const result = addNumber(add, 1);
console.log("result:",result); // result: 2
/**
* 함수를 리턴하는 고차 함수
* @param added 숫자
* @returns 익명 함수가 반환된다. => 반환된 익명 함수는 다시 인자를 받고 합계를 반환한다.
*/
const adder = (added: number) => {
return (num: number) => {
return num + added;
}
}
// adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
const result53 = adder(5)(3);
console.log(result53); // 5 + 3 -> 8
// javascript에서 함수는 일급 객체이며 adder가 리턴하는 함수를 변수에 저장할 수 있다.
const add3 = adder(3);
const result32 = add3(2);
console.log(result32); // 3 + 2 -> 5
const double = (num: number) => {
return num * 2;
}
function doubleAdder(added, func) {
const doubled = func(added);
return function (num) {
return num + doubled;
};
}
const doubleAdder = (added: number, func: (num: number) => number) => {
const doubled = func(added);
return (num: number) => {
return num + doubled;
}
}
/*
* 함수 doubleAdder는 고차 함수입니다.
* 함수 doubleAdder의 인자 func는 함수 doubleAdder의 콜백 함수입니다.
* 함수 double은 함수 doubleAdder의 콜백으로 전달되었습니다.
*/
// doubleAdder(5, double)는 함수이므로 함수 호출 기호 '()'를 사용할 수 있습니다.
doubleAdder(5, double)(3); // (5 * 2) + 3 -> 13
// doubleAdder가 리턴하는 함수를 변수에 저장할 수 있습니다. (일급 객체)
const addTwice3 = doubleAdder(3, double);
addTwice3(2); // (3 * 2) + 2 --> 8
내부 함수(클로저 함수)에서 외부 함수의 값을 사용하는 기법 또는 작동 원리
function outerFunc() {
let outerVal = 2;
function innerFunc() {
let innerVal = 1;
return globalVal + outerVal + innnerVal;
}
return innerVal;
}
const outerFunc = () => {
const outerVal = 2;
const innerFunc = () => {
const innerVal = 1;
return globalVal + outerVal + innterVal;
}
return innerVal;
}
let globalVal = 3;
const innerF = outerFunc();
innerF();