평가랑 코드가 계산( Evaluation ) 되어 값을 만드는 것
> (1 + 2) + 3
> 6 //1+2가 먼저 평가되고 3+3이 평가되어 6을 만들었다.
> [1, 2]
> (2) [1, 2] // 배열로 평가됨
const a = 10 //값으로 다룰 수 있다. 변수에 담을 수 있다.
const add10 = a => a + 10 // 함수의 인자로 사용될 수 있다.
const r = add10(a) // 함수의 결과로 사용될 수 있다.
log(r) // 20
const log = console.log
const add5 = a => a + 5 // add5라는 변수에 a=>a+5 라는 함수를 값으로 전달
log(add5) // 함수의 인자로 함수가 사용 가능
log(add(5)) // 함수는 평가에서 값으로 만들어져 다른 함수( 여기서는 log )에 전달 될 수 있다.
const f1 = () => () => 5 // 함수의 결과로 함수를 사용 가능하다.
log(f1()) // () =>5
const f2 = f1()
log(f2()) //5
함수를 값으로 다루는 함수
const apply1 = f => f(1)
const add2 = a => a+2
log(apply1(add2)) // 3으로 평가
log(apply1(a => a-1)) // 0으로 평가
const times = (f, n) => { // 함수를 인자로 받아서 n 번 실행하는 함수
let i = -1
while(++i < n) f(i)
}
times(log, 3) // 0, 1, 2
times( a => log(a+10), 3) // 10, 11, 12
const addMaker = a => b => a+b
// 여기서 클로저란 b => a+b 라는 함수가 a를 계속해서 기억하고 있다는 뜻
// 즉, b => a+b는 함수이자 a를 기억하는 클로저 이다.
const add = addMaker(10) // addMaker는 함수를 리턴하는 함수
log(add(5)) // 15
log(add(10)) // 20