자바스크립트에서는 함수가 '일급'이다.
'일급'이라는 얘기는 함수를 값으로써 다룰 수 있다는 얘기다.
[1,2+3]
=== [1,5]
[1,2,[3,4]]
=== (3) [1, 2, Array(2)]
const f1 = () => () => 1;
// 1. 함수의 return 값으로 함수가 올 수 있다.
const f2 = f1();
console.log(f2);
//함수의 파라미터 값으로 함수를 넣어줄 수 있다.
console.log(f2());
// 이렇게 함수의 파라미터로 함수의 return값을 넘겨주면
// 함수를 원하는 시점에 실행해서 평가할 수도 있음
== 함수형 프로그래밍은 '일급 함수'의 성질을 가지며 이 성질을 활용하면 많은 조합성을 만들어내고 추상화의 좋은 도구로써 사용할 수 있음
const apply = f => f(1);
// 함수가 함수의 인자로써 '함수'를 받아서 안에서 실행
const add2 = a => a+2;
console.log(apply(add2)); // 결과값 3
// === (a=> a+2) => (a=> a+2)(1);
const times = (f,n) => {
let i = -1;
while(++i < n) f(i);
}
times(console.log,3);
times(a=>console.log(a+10),3);
// 이러한 프로그래밍 기법을 Applicative 프로그래밍이라고 한다.
const addMaker = a => b => a+b;
const add10 = addMaker(10);
console.log(add10(5));
이 때 클로저는 처음 만들어졌을 때의 상태인 a의 값(12)을 기억하고 있다는 뜻
함수이자 a를 기억하는 클로저 (만들어졌을 때의 환경, 함수의 객체를 통칭해서 말하는 용어!)
함수가 함수를 만들어서 return 하는 경우는 클로저를 만들기 위함!