Javascript
함수형 코딩 입문 / 커링, 컴포지션 es5로 구현해보기
변기원
2023. 6. 27. 22:19
함수형 코딩의 핵심 개념이라고 한다.
1. 커링 : 다중 인수를 갖는 함수를 단일 인수를 갖는 함수들의 함수열로 바꾸는 것을 말한다
const printAddr = (location) => (town) => console.log(`${location}시 ${town}구`);
printAddr('인천')('서'); // 인천시 서구
이렇게 함수가 함수를 반환하기 때문에 화살표가 두 개씩 보이면 커링이다.
이것을 es5로 구현해보자
function printAddr(location) {
return function (town) {
console.log(`${location}시 ${town}구`);
};
}
printAddr('인천')('서');
printAddr 함수가 첫 번째 인자가 전달되었을 때 location변수를 담고 있는 렉시컬환경을 참조하는 클로저를 반환한다.
그래서 두 번째 인자가 전달될 때 클로저 함수에 town인자를 전달하면서 호출하는 것과 같다.
printAddr함수가 반환한 내부함수는 location이라는 변수가 없지만 클로저이기 때문에 문자열을 제대로 반환한다.
덕분에 이렇게 쓸 수도 있다.
const printIncheon = printAddr('인천');
const printSeoul = printAddr('서울');
printSeoul('강남'); // 서울시 강남구
printSeoul('마포'); // 서울시 마포구
printIncheon('서'); // 인천시 서구
printIncheon('부평'); // 인천시 부평구
2. 컴포지션 패턴
파이프라인처럼 인자가 주어진 함수들을 통과하는 패턴
const compose = (...fns) => (value) => fns.reduce((c, fn) => fn(c), value);
compose(
fullName,
appendAddr,
removeNames,
console.log
)({ id: 1, lastName: 'byun', firstName: 'kiwon' });
순수함수들을 모아서 파이프라인처럼 활용할 수 있다.
es5로 구현
function compose() {
let arr = arguments;
return function (value) {
let index = 0;
let result = value;
while (index < arr.length) {
result = arr[index](result);
index++;
}
return result;
};
}
argument의 길이만큼 루프를 돌기 위해 index를 만들고 0으로 초기화
함수 실행결과를 저장해서 반환하기 위해 result를 선언 후 초기값으로 할당
루프를 돌면서 첫 번째 함수부터 실행하고 결과를 업데이트,
루프가 끝나면 최종 결과를 반환
시니어코딩 채널에서는 재귀함수를 활용함
function compose() {
var fns = arguments;
return function recursion(obj, i) {
var i = i || 0;
if (i < fns.length) {
return recursion(fns[i](obj), ++i);
}
return obj;
};
}
인덱스를 선언하고 arguments의 길이만큼 반복해서 호출하는 로직은 똑같지만
재귀함수를 사용해서 훨씬 간단한 코드로 구현
참고: 유튜브 시니어코딩
https://www.youtube.com/watch?v=7afBIdMcCDU&list=PLEOnZ6GeucBVixAJGEnHvcGjzz1yrTyfO&index=5