본문 바로가기
Web development/Node.js & Typescript

[Javascript] 함수와 일급객체, 고차함수와 클로저

by 자몬다 2020. 2. 6.

일급객체란?

1) 값으로 사용될 수 있고

2) 변수에 할당할 수 있고

3) 함수의 리턴값으로 사용할 수 있고

4) 함수의 인자로 전달할 수 있는 객체를 말한다.

 

javascript에서 함수는 일급객체이다.

따라서

1) 함수를 값으로 사용할 수 있고

2) 함수를 변수에 할당할 수 있고

3) 함수의 리턴값으로 함수를 사용할 수 있고

4) 함수의 인자로도 함수를 전달할 수 있다.

 

고차함수

함수를 값으로 다룰 수 있다는 의미는

고차함수를 사용할 수 있다는 의미이기도 하다.

고차함수란 함수가 함수를 인자로 받는 것을 말한다.

const test = f ⇒ f(1); 
/**
* 익명함수(f => f(1))를 test 변수에 할당했다.
* 함수의 인자로 함수를 전달했다(f)
* 이 함수는 함수를 인자로 받아 1을 인자로 전달하는 함수다.
*/

const apply3 = f ⇒ f(3) // 함수를 인자로 받아 3을 할당하는 함수
const multiply2 = a ⇒ a * 2 // 값을 받아 2를 곱해주는 함수

console.log(apply3(multiply2)) // 6 이 된다.
// console.log(apply3(a ⇒ a*2))와 동일한 의미

이렇게 함수가 함수를 받아서 실행하게 할 수 있다.

 

클로저

또 함수가 일급객체라는 특성으로 클로저를 사용할 수 있는데,

클로저는 함수가 만들어질 때의 환경을 기억하기 때문에, 동적인 함수를 만들 수 있다.

const multiflyFunc = a ⇒ b ⇒ a * b;
const multifly3 = multiflyFunc(3) // b => 3 * b 와 같다. 받은 값에 3을 곱해주는 함수가 되었다.

console.log(multifly3(5)) // 15

 

위 예제가 이중 화살표 함수때문에 좀 복잡할 수 있어서 풀어서 써봤다.

// const multiplyFunc = a ⇒ b ⇒ a * b;
const multiplyFunc = function(a) {
  return function(b) {
    return a * b;
  }
}

// const multifly3 = multiplyFunc(3)
 const multifly3 = function() { 
  const a = 3; // 이렇게 입력에 3이 고정된 함수가 만들어지는 것과 같다.
  return function(b) {
   	return a * b;
   }
 }

// 결국 아래와 같은의미
const multifly3 = function(b) {
  return 3 * b;
}

// multifly3(5)
function(5) {
  return 3 * 5;
}

 

댓글