12장 함수

Eriniss·2022년 10월 11일
0
post-thumbnail

12.1 함수란?

함수는 일련의 과정을 "문"으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다.

function add(a, b) {
  return a + b
}

12.2 함수를 사용하는 이유

함수는 몇 번이든 호출할 수 있으므로 코드의 재사용이라는 측변에서 매우 유용하다. 이는 코드의 유지보수 편의성과 신뢰성을 높이는 역할을 한다.

12.3 함수 리터럴

함수는 일반 객체와 달리 호출할 수 있다.

function add(a, b) {
  return a + b
}

// function => 함수 선언
// add => 함수 이름
// (a, b) => 함수의 매개변수
// return a + b => 함수 몸체

12.4 함수 정의

함수를 정의하는 방법에는 4가지가 있다.

// 함수 선언문
function add(a, b) {
  return a + b;
}

// 함수 표현식 (식)
const add = function (a, b) {
  return a + b;
}

// Function 생성자 함수 
const add = new Function('a', 'b', 'return a + b');

// 화살표 함수(ES6)
const add = (a, b) => {
  return a + b
}

보통 함수 표현식과 Function 생성자 함수는 잘 사용되지 않는다.

12.4.1 함수 선언문

// 함수 선언문
function add(a, b) {
  return a + b;
}

함수 선언문은 이름을 생략할 수 없다. 또한 "문"이므로 변수에 할당할 수 없다.

12.4.5 화살표 함수

// 화살표 함수(ES6)
const add = (a, b) => {
  return a + b
}

정확한 설명은 26.3절 참조

12.5 함수 호출

12.5.1 매개변수와 인수

함수를 실행하기 위해 필요한 값을 함수 외부에서 함수 내부로 전달할 필요가 있는 경우, 매개변수를 통해 인수를 전달한다. 인수는 값으로 평가될 수 있는 표현식이어야 한다.

12.5.2 인수 확인

자바스크립트는 정적 타입인 타입스크립트와 달리 어떤 인수를 전달해야 하는지, 어떤 값을 반환하는지 명확하지 않다. 따라서 자바스크립트의 경우 함수를 정의할 때 적절한 인수가 전달되었는지 확인할 필요가 있다.

12.5.3 매개변수의 최대 개수

이상적인 함수는 한 가지 일만 해야하며 가급적 작게 만들어야 한다.

12.5.4 반환문

함수는 return 키워드와 표현식(반환값)으로 이뤄진 반환문을 사용해 실행 결과를 함수 외부로 반환(return)할 수 있다.

function multiply(a, b) {
  return a * b; // 반환문
}
// 함수 호출은 반환값으로 평가된다.

const result = multiply(3, 4)
console.log(result) // 12

이때 함수 호출은 표현식이다.

12.7 다양한 함수의 형태

12.7.1 즉시 실행 함수

함수 정의와 동시에 즉시 호출되는 함수를 즉시 실행 함수라고 한다. 한 번만 호출될 수 있으며 재사용이 불가능하다.

const res1 = (function () {
  let a = 3;
  let b = 4;
  return a * b;
}());

const res2 = (function (a, b) {
  return a + b;
}(3, 4));

12.7.2 재귀 함수

함수가 자기 자신을 호출하는 것을 재귀 호출이라 한다.

function factorial(a) {
  if (a === 1) {
    return 1;
  }
  
  return a * factorial(a - 1)
}

이처럼 재귀 함수를 사용하면 반복문 없이도 간단하게 반복 처리를 할 수 있다.

12.7.4 콜백 함수

함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라고 하며, 매개 변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 고차 함수라고 한다.

function repeat(n, f) {
  for(let i = 0; i < n; i++) {
    f(i);
  }
}

let logAll = function (i) {
  console.log(i);
};

repeat(5, logAll); // 0 1 2 3 4

0개의 댓글