// 순수 함수
function add(a, b) {
return a + b;
}
// 순수 함수 아닌 예 - 결과 변경하는 함수
let c = 1
function add2(a, b) {
return a+b+cㅇ
}
add2(10,2)
add2(10,3)
add2(10, 4)
c = 3
add2(10,2)
add2(10,3)
add2(10,4)
// 순수 함수 아닌 예2 - 부수효과 발생하는 함수
function add3(a, b) {
c = b // 부수효과 발생
return a + b;
}
add3(20,30)
// c 값 30으로 바뀜
// 순수 함수 아닌 예3 - 넘어온 인자의 상태 직접 변경
const obj = { val: 10 }
function add4(obj, b) {
obj.val += b
}
obj.val
add4(obj, 20)
// 값이 바뀜
obj.val
// 순수함수 예시
const obj1 = { val: 10 }
function add5(obj, b) {
return{ val : obj.val + b}
}
obj1.val
const obj2 = add5(obj1, 20)
obj1.val
obj2.val
// 1. 순수함수는 항상 동일한 인자를 넣으면 같은 값을 리턴한다
// 2. 순수함수는 평가시점이 중요하지않다
// 특징
// 1. 변수에 함수를 담을 수 있다.
// 2. 함수를 인자로 받을 수 있다.
function add(a, b) {
return a + b;
}
const f1 = function(a){ return a*a ;}
f1
const f2 = add
f2
function f3(f){
return f()
}
f3(function(){return 1})
f3(function(){return 2})
// add_maker - 일급함수와 클로저 예제
function add_maker(a){
// 내부 함수가 클로저
return function(b){
return a+b
}
}
// 중요한 건 add_maker의 내부 함수에서 변수 a가 사용되지만 변경은 하지 않고 있다는 것
const add10 = add_maker(10)
add10(20)
const add15 = add_maker(15)
add15(20)
function f4(f1, f2,f3){
return f3(f1()+f2())
}
f4(
function(){return 2},
function(){return 1},
function(a) {return a* a}
)
// 순수함수가 유용할 때는 비동기가 일어나는 시점, 동시성을 필요한 시점에서 함수를 필요한 시점, 실행하는 시점까지 값으로 다루다 원하는 시점에 평가 가능
데이터(객체) 기준
데이터를 먼저 디자인, 데이터에 맞는 메서드 세팅
dog.moveLeft()
douk.moveLeft()
dog.moveRigft()
duck.moveRigft()
함수 기준
함수를 먼저 만들고, 함수에 맞게 데이터 셋을 구성
moveLeft(dog)
moveRigft(duck)
moveRigft({x:1,y:2})
moveRigft(dog)