[DEV] 01 - 기본기 (함수형프로그래밍 es06)

headerimg 함수형 프로그래밍과 javascript es6를 깊게 파보기.

기본기

angularJS를 사용하다 es06를 접해 접목해보고 react, vue 등의 프레임워크를 공부하다 보니 JS 기본기가 부족한 것이 많이 느껴졌다. 면접에서도 그렇고.. 언뜻 느낌적인 느낌만 알고만 있는 함수형 프로그래밍과 es06에 대해 탄탄한 기본기를 기르기 위해

평가

  • 코드가 계산(Evaluation) 되어 값을 만드는 것
1 // 1
1 + 2 // 3
(1 + 5) + 5 //  11
[1, 2, ...[3, 4]] // [1, 2, 3, 4]

일급(first-class)

  • 값으로 다룰 수 있다.
  • 변수에 담을 수 있다.
  • 함수의 인자로 사용될 수 있다.
  • 함수의 결과로 사용될 수 있다.
const foo = 10; // 값으로 다룰 수 있고, 변수에 담을 수 있다.
const add10 = num => num + 10; 
// 함수의 인자로 num이 전달(사용) 될 수 있고
// 함수의 결과(리턴)으로 사용될 수 있다.

const bar = add10(20);
console.log(bar); // 30

일급 함수

  • JS에서는 함수는 일급이다.
  • 함수를 값으로 다룰 수 있다.
  • 조합성과 추상화의 도구
  • 함수를 다른 변수와 동일하게 다루는 언어는 일급 함수를 가졌다고 표현합니다. 예를 들어, 일급 함수를 가진 언어에서는 함수를 다른 함수에 매개변수로 제공하거나, 함수가 함수를 반환할 수 있으며, 변수에도 할당할 수 있습니다. (by MDN)
const add7 = a => a + 7; // 변수에 함수를 값으로 담을 수 있다.
console.log(add7);  // 다른함수(console.log)의 인자로 사용 될 수 있다.
console.log(add7(3)); // 함수를 평가해서 값으로 만들 수 있다.

const f1 = () => () => 1; //함수의 결과로 함수를 사용할 수 있다.
console.log(f1()); 

const f2 = f1();
console.log(f2);
console.log(f2()); 

고차 함수

  • 함수를 값으로 다루는 함수.

    고차함수에는 두 가지 유형이 있다.


함수를 인자로 받아서 실행하는 함수

const apply1 = f => f(1); 
// 고차함수 apply1
// 함수(apply1)가 함수를 인자로 받아서 1을 f의 인자 값으로 주는 함수. 

const add2 = a => a + 2;

console.log(apply1(add2)); // 3
console.log(apply1(a=>a-1)); // 0

const times = (f, n) => { // 함수를 값으로 받고.
    let i = -1;
    while(++i < n) f(i));
}

times(console.log, 3)
// 0
// 1
// 2

times(a => console.log(a + 10), 3)
// 10
// 11
// 12


함수를 만들어 리턴하는 함수

const addMaker = a => b => a + b;
/*
b => a + b 함수는 클로저이다. 
반환된 내부함수(a => a+ b)가 자신이 선언될 때, 렉시컬 환경(스코프)을 기억해(a가 10), 
렉시컬 환경 밖에서 호출되어도 그 렉시컬 환경(a가 10)에 접근 할 수 있는 함수가 클로저.
*/
const add10 = addMaker(10);

console.log(add10(5)); // 15
console.log(add10(10)); // 20


참고
렉시컬 환경 : 컴파일러는 코드를 실행하는 첫 단계에 토크나이징/렉싱 이라는 작업을 한다.
var a = b; 에서
var
a
=
b
;
식으로 토큰화하여 의미를 부여하는 것을 렉싱이라 한다. 이 렉싱 단계에서 모든 변수들이 어떻게 선언되었는지 실행단계에서 스코프를 구성하는데 이게 렉시컬 환경(스코프) 이다.


© 2018. All rights reserved.

Powered by blowROCK