순수함수(pure function) : 외부에 아무런 영향을 미치지 않는 함수를 순수함수라고 이야기한다.
순수 함수가 강력한 이유 중 하나는 테스트 및 디버그가 훨씬 더 쉽기 때문이다. 순수 함수는 특정 입력 값이 주어지면 동일한 출력을 반환해야 하므로 이 함수를 매우 쉽게 테스트할 수 있다.
고차함수(high-order function) : 함수를 또 하나의 값으로 간주하여 함수의 인자 혹은 반환값으로 사용을 하는데 이를 고차함수라고 한다.
JS 에서 map(), reduce(), filter() 등이 고차함수다.
서적들을 잘 살펴보면, 함수란 특정 기능을 수행하는 코드 집합 or 특정 기능을 작은 프로그램 단위 라고 소개를 하는데 이는 명령형 프로그래밍에서 이야기하는 함수의 개념이다.
// 합을 구하는 코드
function sum(x, y) {
const result = x + y;
return result;
}
sum(1,2);
위 코드는 명령형 프로그래밍으로 작성한거다. 이를 함수형으로 바꾸면?
const sum = x => {
return y => x + y;
}
sum(1)(2);
// or
// const sumReadyY = sum(1);
// sumReadyY(2);
커링을 활용해보았다. sum(1) 을 실행하면, 익명 화살표 함수를 반환한다.(이때 클로저로 인해 x 값을 기억하고 있다) 이때 더할 숫자를 하나 더 넘겨서 결과를 얻는다. => 3
초기에 셋팅한 x 인자는 외부에서 접근이 불가능하다. -> x 값을 클로저를 사용하여 영향을 받지 않는다.
// 명령형
const numbers = [1, 2, 3, 4, 5];
let resultSum = 0;
for(let num of numbers) {
resultSum += num;
}
// 선언형(함수형 프로그래밍)
// reduce() 가 인자로 들어온 sum() 의 로직 수행
const numbers = [1, 2, 3, 4, 5];
const sum = (x, y) => x + y;
const sumNumbers = numbers.reduce(sum, 0);
console.log(sumNumbers); // 15
// 아래와 같은 경우는 순수함수가 아님
let c = 10;
function add(a, b) {
return a + b + c;
}
console.log(add(10, 2)); // 22
c = 20; // 값 변경
console.log(add(10, 2)); // 32