[Javascript] 함수형 프로그래밍
* 고차함수 
    - 함수를 인자로 받거나, 함수를 리턴하는 함수
        map, filter 등
* 일급함수 
    - 언제나(런타임에서도) 선언 가능 
    - 익명 선언 가능 
    - 함수의 인자로 사용 가능 
* 클로저 
    - 내부함수이고 리턴되어 메모리가 해제되지 않음 
    - 자신의 외부 변수를 사용하지 않으면 해제됨 
    - 실행환경을 기억(메모리가 해제되지 않음) 
    - 기억하고 있는 환경은 변경될 수 있음 
//----------------------- 
* 커링함수(currying) 
    - 함수의 인자 수보다 적은 수의 인자를 받으면 누락된 인자를 받는 기법 
    - 고차함수의 보조함수(콜백함수)로 활용 
//일반 함수 
var sum = function (x, y, z) { return x+y+z;} 
//커링 함수 
var sum2 = function(x) { 
  return function(y) { 
    return function(z) { 
        return x+y+z; 
    }; 
  }; 
}; 
ret = sum(1,2,3); 
ret = sum2(1)(2)(3); 
일반함수를 커링함수로 만들기 
var sum3 = _.curry(sum); //lodash 이용 
//--------------------- 
    - function 의 프로토타입 메서드 bind()를 이용해 커링 효과를 낼수 있다. 
function add(a, b) { 
  return a + b; 
} 
var add10 = add.bind(null, 10); 
ret = add10(20);// 30 
//-------------- 
// 부분 적용 (Partial Application) 
    - 인자를 미리 부분적으로 적용 
    - bind는 앞부터 순차적으로 적용해야 하는 제한 
    - 함수의 중간 인자를 미리 부분적용 하는 경우 
function abc(a, b, c) { 
  console.log(a, b, c); 
} 
var ac = _.partial(abc, _, 'z'); //lodash 이용 
ret = ac('a', 'c'); // a z c