
함수를 입력으로 받아서 하나씩 결합하는 함수 ‘파이프’를 만들어 봅시다.
//출력 예시
function square(num) {
return num * num;
}
function add5(num) {
return num + 5;
}
function mul3(num) {
return num * 3;
}
function isOdd(num) {
return num % 2 !== 0;
}
let output = pipe(add5, square);
console.log(output(4)); // --> 81
output = pipe(square, add5, mul3);
console.log(output(4)); // --> 63
output = pipe(square, mul3, add5, add5, isOdd);
console.log(output(4)); // --> false
함수를 실행하고 다른 함수를 반환하는 것이 어떻게 가능합니까?
이것이 고차 함수의 개념입니다.
고차 함수는 일급 객체로서의 함수의 특성 때문에 가능합니다.
일급 객체
• 변수에 할당할 수 있습니다.
• 다른 함수에 인수로 전달할 수 있습니다.
• 다른 함수의 결과로 반환될 수 있습니다.
함수는 대표적인 일급 객체입니다.
위의 속성으로 인해 고차 함수, 즉 함수에 인수로 전달되거나 함수를 반환하는 함수가 존재할 수 있습니다.
위의 예에서 파이프 함수는 여러 다른 함수를 인수로 사용하고 이러한 함수의 연결을 반환합니다.
즉, pipe(add5, square)(4)는 add5(square(4))와 동일한 결과를 반환해야 합니다.
함수를 작성한 결과는 다음과 같습니다.
//몇 개의 전달인자가 들어올지 알 수 없으므로 ...rest 파라미터를 사용한다.
//rest는 전달인자들을 배열로 받는다.
function pipe(...rest) {
//pipe함수는 새로운 함수를 리턴한다.
//리턴될 함수는 나중에 전달될 전달인자를 받을 수 있도록 파라미터를 둔다(num).
return function(num){
//result라는 변수를 선언해 나중에 내부함수에서 리턴할 준비를 한다.
//이 result는 뒤에 나올 for문에서 배열을 순회함에 따라서 값이 계속 바뀐다.
let result = num;
//rest 배열을 순회하는 for ... of문을 작성한다.
for(let x of rest){
//배열에 나열돼 있는 각 함수의 결과값이 차례로 result에 할당된다.
result = x(result)
}
//result를 리턴
return result;
}
}
이러한 고차 함수를 사용하면 값을 받고 값만 전달하는 함수보다 훨씬 복잡한 과정을 수행할 수 있습니다.
어떤 기능을 수행하기 위한 사고 과정의 흐름을 담고 있는 기능을 상상한다면,
고차 기능을 사용하면 생각의 흐름이 하나로 압축되어 다른 생각 프로세스에 공급될 수 있습니다.
고차 함수를 통한 상위 함수 추상적인달성할 수 있습니다.

