# 함수형 자바스크립트

요즘 함수형 프로그래밍이 인기가 많아서, 함수형 자바스크립트에 대해 간단하게 설명하려고 한다!

우선 함수형 프로그래밍은 상태를 공유하는것과 데이터변조를(예상치 못한, 사이드이펙트) 방지할수있다.

그리고 사실 함수형은 자바스크립트에서 중요한 컨셉중 하나다. (나머지 하나는 프로토타입)

1. 순수 함수
2. 불변성
3. 사이드이펙트 방지
4. 단순한 함수의 구성
5. 함수형 언어들: Haskell, Scala, Lisp, F Sharp, ...

# 순수 함수의 특징

  • 참조 투명성 => 함수가 동일한 입력을 받으면 동일한 출력을 내보낸다. => 외부 변수를 제거한다. => 전체 로직을 파악하기 쉽고 테스트가 쉽다.

이어서..

자바스크립트가 함수형을 지원하는 기능들

자바스크립트에서 함수는 일급객체이다.

고차함수와 FP기법(커링.. etc)을 활용

# high order funtion

  1. 함수를 파라미터로 전달받는 함수(functions as arguments) => Array.prototype.map 을 떠올리면 된다.
  2. 함수를 리턴받는 함수(functions as values) => 커링을 생각하시면 된다.

# 순수함수

같은 input이라면 항상 같은 리턴값을 가지는 함수.

외부의 값을 변경하지않는다. Date.now 같은 함수도 내부에서 사용하지않고(호출할때마다 매번 결과값이 달라지므로), Disk IO, network IO등 사이드이펙트가 없어야한다.

조합하기좋다. 함수를 다른함수의 인자로 넘길수있다.

모듈화하기좋고 테스트코드작성하기 좋다.

함수들이 단순해진다.

결국 안전한 함수를 추구하는것이다.

함수형 자바스크립트라는 책에서는 아래처럼 설명하고 있습니다.

- 주어진 입력에만 의존할 뿐,평가 도중 또는 호출 간 변경될 수 있는 숨겨진 값이나 외부상태와 무관하게 작동합니다.

- 전역 객체나 레퍼런스로 전달된 매개변수를 수정하는 등 함수 스코프 밖에서 어떠한 변경도 일으키지 않습니다.

side-effect

• 전역 범위에서 변수,속성,자료구조를 변경
• 함수의 원래 인수 값을 변경
• 사용자 입력을 처리
• 예외를 일으킨 해당 함수가 붙잡지 않고(catch) 그대로 예외를 던짐(throw)
• 화면 또는 로그 파일에 출력
• HTML 문서, 브라우저 쿠키, DB에 질의

# 커링

함수의 인수를 미리 세팅하거나 부분 평가하기 위해 함수 기능을 추상화한다.

여러 함수들로 분리하여 함수 크기를 줄이고, 함수의 합성을 쉽게하여 재활용성을 높일 수 있습니다.

함수를 합성하려면 side-effect가 없어야합니다.

필요한 것은 인수를 통해 전달받습니다.