let num = 1;
function add(a) {
return a + num;
} => (X)
function add(a, b) {
return a + b;
} => (O)
: 함수에서 외부 상태값을 참조하거나, 외부의 상태를 변경하는 것은 순수함수라고 볼 수 없다.
: 동일한 인자를 넣었을 때, 항상 동일한 결과값을 반환하고
: 언제 선언이 되었는 지, 외부에 전혀 영향을 받지 않아야 함.
-> 함수 안에서 외부의 상태값을 변경한다면 그건 함수형 프로그래밍이 아닌 절차지향적 프로그래밍일 가능성 높음
let person = { name: 'dyung', age: 20 }
function increaseAge(person) {
person.age = person.age + 1;
return person;
} => (X)
const person = { name: 'dyung', age: 20 }
function increaseAge(person) {
return { ...person, age: person.age + 1 };
} => (O)
: 비상태, 불변성을 유지해야 함
: 함수에 전달된 인자를 변경하는 것은 절대 함수형 프로그래밍이 아님
: 함수형 프로그래밍은 전달된 인자를 변경하는 것이 아니라 새로운 오브젝트를 만들어서 결과값으로 전달해야하는 것
: 외부의 상태나 함수의 인자로 전달된 데이터 상태를 변경하지 않음으로서 사이드 이펙트를 만들 지 않음으로서 불변성을 유지
-> 여러가지 동시다발적인 멀티 스레딩 환경에서도 안정적으로 동작 가능
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
for(let i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i] =* multiplier;
}
} => (X)
function muliply(numbers, multipliers) {
return numbers.map(num => num * multiplier);
}
: if, switch, for과 같은 여러가지 문장을 사용하는 것은 함수형 프로그래밍이 아님
//first-class
const addTwo = a => a + 2;
const multiplyTwo = a => a * 2;
const transform = numbers => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1, 2, 3, 4]); > (4) [6, 8, 10, 12]
// higher-order functions
const addTwoppings = topping => food => food + topping;
const egg = addToppings('🍳');
const bacon = addToppings('🥓');
console.log(egg('🥘')); > 🥘🍳
console.log(bacon('🥪')); > 🥪🥓
: 함수를 변수에 할당하거나 함수에 인자로 전달하거나, return 하는 등의 일을 할 수 있는 first class 특징과
: 함수 자체를 인자로 전달하거나
: 함수에서 또 다른 함수를 리턴하는 higher-order function
: 두 가지의 속성을 가지고 있어야 함