[JavaScript] 평가와 일급

정예원·2021년 8월 10일
0

JavaScript

목록 보기
10/13
post-thumbnail

1. 평가

평가는 코드가 계산되어 값을 만드는 것입니다.

[1, 2+3] 
> [1,5]

[1, 2, [3, 4]] 
> [1, 2, Array(2)]

[1, 2, ...[3, 4]] 
> [1, 2, 3, 4]

2. 일급

  1. 으로 다룰 수 있다.
  2. 변수에 담을 수 있다.
  3. 함수의 인자로 사용될 수 있다.
  4. 함수의 결과로 사용될 수 있다.
const a = 10;
const add10 = a => a+10;
const r = add10(a);
console.log(r); // 20

2-1 일급 함수

  1. 함수를 으로 다룰 수 있다.
  2. 조합성추상화의 도구
  3. 함수의 결과값으로 함수를 사용할 수 있다.
const f1 = () => () => 1; // 3번
log(f1());

const f2 = f1(); // 1번

2-2 고차 함수

함수를 값으로 다루는 함수

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

const apply1 = f => f(1);
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(log, 3); // 0, 1, 2
times(a => log(a+10), 3); // 10, 11, 12

2. 함수를 만들어 리턴하는 함수
= 클로저를 만들어 리턴하는 함수

const addMaker = (a) => (b) => a + b;
const add10 = addMaker(10);
console.log(add10); // b => a + b 

+ 클로저

  1. 클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경과의 조합이다.
  2. 반환된 내부함수가 자신이 선언됐을 때의 환경인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수이다.
  3. javascript의 고유개념이 아니라 함수형 프로그래밍 언어에서 사용되는 중요한 특성이다.
  4. 현재 상태를 기억하고 변경된 최신 상태를 유지해야 하는 상황에 유용하다.

    렉시컬 환경(Lexical environment)
    내부 함수가 선언됐을 대의 스코프

// 함수를 인자로 전달받고 함수를 반환하는 고차 함수
// 이 함수가 반환하는 함수는 클로저로서 카운트 상태를 유지하기 위한 자유 변수 counter을 기억한다.
function makeCounter(predicate) {
  // 카운트 상태를 유지하기 위한 자유 변수
  var counter = 0;
  // 클로저를 반환
  return function () {
    counter = predicate(counter);
    return counter;
  };
}

// 보조 함수
function increase(n) {
  return ++n;
}

// 보조 함수
function decrease(n) {
  return --n;
}

// 함수로 함수를 생성한다.
// makeCounter 함수는 보조 함수를 인자로 전달받아 함수를 반환한다
const increaser = makeCounter(increase);
console.log(increaser()); // 1
console.log(increaser()); // 2

// increaser 함수와는 별개의 독립된 렉시컬 환경을 갖기 때문에 카운터 상태가 연동하지 않는다.
const decreaser = makeCounter(decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2

makeCounter를 호출해 함수를 반환할 때 반환된 함수는 자신만의 독립된 렉시컬 환경을 갖는다.
이는 함수를 호출하면 그때마다 새로운 렉시컬 환경이 생성되기 때문이다.
위 예제에서 변수 increaserdecreaser에 할당횐 함수는 각각 자신만의 독립된 렉시컬 환경을 갖기 때문에 자유 변수 counter를 공유하지 않아 증감이 연동되지 않는다.

Reference

https://poiemaweb.com/js-closure

profile
hello world!

0개의 댓글