부수 효과를 없애고 함수끼리의 조합성을 강조하는 프로그래밍 패러다임!
const arr = [1, 2, 3, 4, 5];
const map = arr.map(function(x) {
return x * 2;
}); // [2, 4, 6, 8, 10]
입력 : arr / 출력 : map / 변수 arr은 사용은 됐지만 값 변화 X, map이란 결과를 내고 아무런 부작용 X
❌
const arr = [1, 2, 3, 4, 5];
const condition = function(x) {return x % 2 === 0}
const ex = function(array) {
return array.filter(condition);
};
ex(arr); // [2, 4]
ex 함수가 인자로 받지 않은 condition 변수를 사용하고 있다.
✅
const ex = function(array, cond) {
return array.filter(cond);
};
ex(arr, condition);
condition 변수를 인자로 받아 순수함수가 되었다. 이를 통해 에러 추적이 쉬워졌다.
❌
var sum = 0;
for (var i = 1; i <= 10; i++) {
sum += i;
}
순수함수를 만들 때엔 반복문을 쓰지 않는게 좋다.
✅
function add(sum, count) {
sum += count;
if (count > 0) {
return add(sum, count - 1);
} else {
return sum;
}
}
add(0, 10); // 55
인자로 받은 sum과 count만 활용했기 때문에 순수함수이다.
✅
const arr = [1,2,3,4,5,6,7,8,9,10];
const answer = arr.reduce((pre, cur) => {
return pre + cur;
});
console.log(answer); // 55
위 코드를 고차함수인 reduce를 활용해서 간결하게 만들었다.
❌
let a = 0;
function increment1() {
return a += 1;
}
increment1 함수가 외부 데이터 변수인 a에 의존하고 있다.
✅
increment2(a) {
return a + 1;
}
인자로 받은 a와, 상수 1만 활용했기 때문에 순수함수이다.
아래의 메소드들은 함수형 프로그래밍 개념에 따라
기존 변수에 대한 사이드 이펙트가 없도록 구현하는 것이 원칙이다.
const arr = ['foo', 'hello', 'diamond', 'A'];
const arr2 = arr.map((v) => v.length);
console.log(arr2) // [3, 5, 6, 1]
const arr = [4, 15, 377, 395, 400, 1024, 3000];
const arr2 = arr.filter((v) => (v % 5 === 0));
console.log(arr2) // [15, 395, 400, 3000]
let arr = [9, 2, 8, 5, 7];
let sum = arr.reduce((pre, val) => pre + val);
console.log(sum) // 31
const arr = ['foo', 'hello', 'diamond', 'A'];
const arr2 = arr.reduce((pre, val) => {
pre.push(val.length);
return pre;
}, [])
console.log(arr2) // [3, 5, 7, 1]
const arr = [4, 15, 377, 395, 400, 1024, 3000]
const arr2 = arr.reduce((pre,val) => {
if(val % 5 === 0) pre.push(val);
return pre;
},[])
console.log(arr2) // [15, 395, 400, 3000]
const arr = [4, 15, 377, 395, 400, 1024, 3000]
const arr2 = arr.reduce((pre, val) => {
if(typeof pre == 'undefined' && val % 5 === 0) {
pre = value;
}
return pre;
}, undefined);
console.log(arr2) // 15