함수는 일련의 과정을 "문"으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의한 것이다.
function add(a, b) {
return a + b
}
함수는 몇 번이든 호출할 수 있으므로 코드의 재사용이라는 측변에서 매우 유용하다. 이는 코드의 유지보수 편의성과 신뢰성을 높이는 역할을 한다.
함수는 일반 객체와 달리 호출할 수 있다.
function add(a, b) {
return a + b
}
// function => 함수 선언
// add => 함수 이름
// (a, b) => 함수의 매개변수
// return a + b => 함수 몸체
함수를 정의하는 방법에는 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 생성자 함수는 잘 사용되지 않는다.
// 함수 선언문
function add(a, b) {
return a + b;
}
함수 선언문은 이름을 생략할 수 없다. 또한 "문"이므로 변수에 할당할 수 없다.
// 화살표 함수(ES6)
const add = (a, b) => {
return a + b
}
정확한 설명은 26.3절 참조
함수를 실행하기 위해 필요한 값을 함수 외부에서 함수 내부로 전달할 필요가 있는 경우, 매개변수를 통해 인수를 전달한다. 인수는 값으로 평가될 수 있는 표현식이어야 한다.
자바스크립트는 정적 타입인 타입스크립트와 달리 어떤 인수를 전달해야 하는지, 어떤 값을 반환하는지 명확하지 않다. 따라서 자바스크립트의 경우 함수를 정의할 때 적절한 인수가 전달되었는지 확인할 필요가 있다.
이상적인 함수는 한 가지 일만 해야하며 가급적 작게 만들어야 한다.
함수는 return 키워드와 표현식(반환값)으로 이뤄진 반환문을 사용해 실행 결과를 함수 외부로 반환(return)할 수 있다.
function multiply(a, b) {
return a * b; // 반환문
}
// 함수 호출은 반환값으로 평가된다.
const result = multiply(3, 4)
console.log(result) // 12
이때 함수 호출은 표현식이다.
함수 정의와 동시에 즉시 호출되는 함수를 즉시 실행 함수라고 한다. 한 번만 호출될 수 있으며 재사용이 불가능하다.
const res1 = (function () {
let a = 3;
let b = 4;
return a * b;
}());
const res2 = (function (a, b) {
return a + b;
}(3, 4));
함수가 자기 자신을 호출하는 것을 재귀 호출이라 한다.
function factorial(a) {
if (a === 1) {
return 1;
}
return a * factorial(a - 1)
}
이처럼 재귀 함수를 사용하면 반복문 없이도 간단하게 반복 처리를 할 수 있다.
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라고 하며, 매개 변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 고차 함수라고 한다.
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