카피 온 라이트(Copy-On-Write)
메서드를 호출할 때마다 새 객체를 만들어 반환하는 방법 이 과정은 따분하고 에러가 발생할 가능성도 커진다.
렌즈(lense) 또는 함수형 레퍼런스(functional reference)
상태적 자료형의 속성에 접근하여 불변화하는 함수형 프로그래밍 기법 렌즈의 작동방식은 카피 온 라이트(Copy-On-Write) 방식과 비슷 상태를 관리하고 복사하는 방법을 알고 있는 내부 저장소 컴포넌트를 이용 람다JS 라는 라이브러리 사용
함수
FP의 함수는 수학책에 나오는 함수처럼 사용 가능한 결과를 낼 결우에만 유의미 표현식(expression, 값을 내는 함수)과 구문(statement, 값을 내지 않는 함수) 두 용어를 구분 FP 코드는 전반적으로 표현 위주라서 void 함수는 도움이 되지 않음
고계함수
고계함수를 쓰면 선언적 패턴이 점점 늘어나기 시작해서 표현식만 봐도 프로그램이 하는일을 파악할 수 있다.
this
함수형 프로그래밍에서는 this를 쓸 일이 없고 쓰면 안된다.
함수 메서드
자바스크림트 함수는 프로토타입에 소속된 (일종의 상위 함수 같으) apply와 call 메서드로도 호출이 가능 API 사용자가 기존 함수에서 새 함수를 간단히 만들어 쓰는 용도로 많이 씀
아래 예시는 함수를 인수로 받아 그 실행 결과를 논리적으로 부정하는 함수
MDN Web Docs Function.prototype.apply()
// 고계함수 negate는 함수를 받아 그 실행결과를 부정하는 함수를 반환
function negate (func) {
return function () {
// Function.apply()로 원본 인수를 넣어 함수를 실행
return !func.apply(null, arguments);
}
}
function isNull (val) {
return val === null;
}
const isNotNull = negate(isNull);
console.log(isNotNull(null)); // -> false
console.log(isNotNull({})); // -> true
클로저(closure)
함수를 선언할 당시의 환경에 함수를 묶어둔 자료구조
함수 선언부의 물리적 위치에 의존하므로 정적 스코프 혹은 어휘 스코프라고도 한다. 함수가 지신을 둘러싼 주변 상태에 접근할 수 있기 때문에 클로저를 이용하면 명확하고 가독성 높은 코드를 작성할 수 있다.
또한 고계함수를 응용한 FP 뿐만 아니라 이벤트 처리 및 콜백, 프라이빗 변수 모방, 그리고 자바스크립트의 일부 약점을 보완하는 용도로도 유익
다만 FP 스타일로 개발할 땐 전역변수는 삼가한다.
명령형 프로그래밍
분기, 루프에 따라 움직이는 일련의 연산(구문)들로 구성
선언적(함수형) 프로그래밍
함수형 프로그램은 서로 연결된 블랙박스 연산을 제어 정보는 한 연산에서 다른 연산으로 독립적으로 흘러가며, 분기와 반복은 상당 부분 줄이거나 아예 없애고 고수준의 추상화로 대체
자료구조를 새로 만들어 어떤 요건을 충족시키는게 아니라, 배열 등의 흔한 자료 구조를 이용해 다수의 굵게 나뉜 고계 연산을 적용
- 작업을 수행하기 위해 무슨 일을 해야 하는지 기술된 함수를 인수로 받는다.
- 임시 변수의 값을 계속 바꾸면서 부수효과를 일으키는 기존 수동 루프를 대체, 그 결과 관리할 코드가 줄고 에러가 날 만한 코드 역시 줄어듬