하나 이상의 함수를 인자로 받는다
함수를 결과로 반환한다.
즉, 함수를 다루는 함수를 말한다.
const repeatTwice = function(func, num) {
return func(func(num));
};
const plusOne = function(num) {
return num + 1;
};
console.log(repeatTwice(plusOne, 1));
// 출력결과 : 3
repeatTwice()
는 함수를 인자로 받아 해당 함수를 두번 반복실행하는 함수이다.인자로 들어오는 함수가 무엇이냐에 따라 어떤 내용을 반복 실행할지가 달라진다. 즉, 사용자가 원하는대로 로직을 제어할 수 있다.
HOF는 함수의 흐름을 제어하는 파라미터로써 함수를 수용한다.
아래와 같이 0부터 99까지 출력함는 함수가 있다.
for (let i = 0; i < 100; i++) {
console.log(i);
}
만약 99가 아닌 n
까지 출력해야 할 경우, 해당 부분을 함수로 만들어 유연하게 대처할 수 있다.
function repeat(n) {
for (let i = 0; i < n; i++) {
console.log(i);
}
}
repeat(10000);
그러나
HOF를 사용해 위와 같이 달라지는 요구사항에 유연하게 대응할 수 있는 구조를 만들 수 있다.
세부사항을 추상화하여 함수로 제공한다.
function repeat(n, fn, interval) {
for (let i = 0; i < n; i = interval(i)) {
fn(i);
}
}
//0부터 99까지 배열에 담기
const list = [];
repeat(100,
(i) => list.push(i),
i => i === 0 ? ++i : i+i);
// list = [0, 1, 2, 4, 8, 16, 32, 64]
function fillArray(n, fn) {
let array = [];
for (let i = 0; i < n; i++) {
array.push(fn(i));
}
}
function makeItem(i) {
return i => `item${i}`;
}
const array = fillArray(3, makeItem);
// array = [ 'item0', 'item1', item'2']
makeItem()
함수가 함수를 반환하는 함수이다.각 인덱스에 따른 데이터 맵핑 시 사용
let result = [1, 2, 3]
result.map(value => value * 2);
console.log(result);
//출력결과 : [2, 4, 6]
각 요소를 순회한 결과를 누적값으로 가져가야 하는 경우에 사용
let result = [1, 2, 3]
result.reduce((acc, cur) => acc + cur);
console.log(result);
//출력결과 : 6
acc
에 저장한다.ramdajs.com 참고
HOF는 자바스크립트에서 함수형 프로그래밍을 가능하게 한다.
함수를 인자로 받아 함수를 반환하므로 이는 곧 함수끼리의 합성을 의미한다.
특히 값을 나중에 평가한다는 점에서 매우 활용도가 높다.