
함수형 프로그래밍이 갖는 특징 중 하나이다.
= 함수를 인자로 전달받거나, 함수를 결과로 반환하는 함수
(인자로 받은 함수를 필요한 시점에 호출 or 클로저로 반환)
※ 함수를 인자로 전달하고 return할 수 있다고?
자바스크립트의 함수는 일급 객체이기 때문에 함수가 값처럼 쓰일 수 있다!
추상화 때문 !! => 생산성 ↑
우리는 반복되는 기능을 하나의 함수로 묶어 값을 인자로 전달하기만 하면 원하는 값을 얻을 수 있다. 이 경우도 추상화(값 수준의) 라고 부를 수 있다. 여기서 추상화 단계가 더 높아진 것이 고차함수인데, 이는 사고의 추상화이기 때문이다. 사고의 추상화는 함수(사고 묶음)를 전달받아 처리하는 것으로, 고차함수는 함수를 인자로 전달받거나 반환하기 때문에 함수에 대한 로직은 감춰져 있다.
= 인자로 함수를 전달받고, 함수 내부에서 실행되는 함수
아래에 소개될 고차함수들도 주어진 함수 안에 익명의 함수 (forEach라면 모든 요소들을 탐색하며 console.log()를 찍는 익명함수가 쓰인다던지 ..)를 활용해 동작시킨다.
()를 붙일 필요 X배열 메서드들 중 대부분이 내부 고차함수이다.
주어진 배열의 모든 요소들을 빠짐없이 순회하는 함수
(반환값 X)
-> 그래서 break문이 무용지물
const arr = [1,2,3,4,5]
let sum = 0;
arr.forEach((element) => sum += element);
console.log(sum); //15
주어진 콜백함수의 반환 값으로 새로운 배열을 반환하는 함수
-> 절!대! 기존배열을 수정하지 않음
const arr = [1, 2, 3, 4, 5];
const newArr = arr.map((element) => {
return element * element;
});
console.log(newArr); // [1,4,9,16,25]
주어진 배열의 요소들 중 특정 조건에 해당하는 요소만 담아 새로운 배열로 반환해주는 함수
const arr = [1,2,3,4,5];
const newArr = arr.filter((element) => element > 2);
console.log(newArr); // [3,4,5]
주어진 배열의 요소를 어떤 함수에 따라 원하는 하나의 형태로 만들어 반환
특이하게 콜백함수에서 4가지 인수를 가진다. 누적값, 현재 요소, 현재 인덱스, 호출 배열!
const arr = [1, 2, 3, 4, 5];
const newArr = arr.reduce((sum, cur) => (sum -= cur), 0);
//여기서는 위에 0이라는 초기값을 꼭 설정해줘야 함!
//(왜냐면 최초 호출 시의 초기값, 누적값이 달라짐)
console.log(newArr); //-15
** 자스외의 다른 언어에도 존재!
인자가 여러개인 함수의 일부 인자를 고정시켜 새로운 함수를 만드는 기법
ex. f(a,b,c) -> f(a)(b)(c)
//ex1
// a와 b 두 개의 인수를 커링하는 헬퍼함수 curry2
function curry2(f) {
return function (a) {
return function (b) {
return f(a, b);
};
};
}
function sum(a, b) {
return a + b;
}
let curry = curry2(sum);
console.log(curry(3)(4)); // 7
//ex2
const curry = (a) => (b, c) => (d) => {
console.log(a, b, c, d);
};
curry("커링")("너무", "어려워")("적용가능?");
// 커링 너무 어려워 적용가능?
주어진 배열의 한 요소라도 특정 조건을 만족하는지 확인하는 함수
(= 하나라도 만족: true 반환, 아니면 false 반환)
주어진 배열의 모든 요소가 특정 조건을 만족하는지 확인하는 함수
(= 모두 만족: true반환, 아니면 false 반환)
//some과 every의 아주 간단한 예시
const arr = [1, 2, 3, 4, 5];
console.log(arr.some((element) => element > 0)); //true
console.log(arr.every((element) => element < 1)); //false