JAVASCRIPT · 심층 가이드
JavaScript 함수 완전 정리
선언 방식과 기본값 매개변수에서 시작해 클로저, 메모이제이션, 커링, 파이프라인까지 JavaScript 함수를 조립 단위로 다루는 20개 예제입니다.
JavaScript에서 함수는 호출할 수 있는 객체입니다. 변수에 담고, 인자로 넘기고, 다른 함수가 만들어 돌려줄 수 있습니다. 이 사실 하나에서 map, 콜백, 미들웨어, 데코레이터가 전부 파생됩니다. 초보자의 모델이 깨지는 지점은 this입니다. 일반 함수의 this는 정의 위치가 아니라 호출 방식으로 결정되고, 화살표 함수는 그런 this를 아예 갖지 않고 바깥 스코프의 것을 그대로 씁니다. 두 종류가 서로 다른 도구라는 걸 받아들이면 대부분의 혼란이 정리됩니다.
기본 함수 선언과 람다 함수로 두 표기법을 나란히 보고, 클로저 카운터에서 함수가 자신이 태어난 스코프의 변수를 계속 붙잡는다는 사실을 확인합니다. 이 클로저가 뒤쪽 주제 대부분의 토대입니다. 메모이제이션은 캐시를 클로저에 숨긴 것이고, 커링과 함수 팩토리는 인자 일부를 클로저에 미리 담아 둔 것입니다. compose 함수와 파이프라인 함수까지 오면 작은 함수들을 데이터 흐름 순서대로 붙여 쓰는 형태가 완성됩니다.
기본값 매개변수는 호출할 때마다 새로 평가됩니다. function push(item, list = [])는 호출마다 새 배열을 만들기 때문에, 기본 인자가 호출 간에 공유되는 Python의 유명한 함정이 여기서는 발생하지 않습니다. 반대로 매번 새 객체가 생기므로 무거운 값을 기본값에 두면 비용이 반복됩니다. 메모이제이션에는 다른 함정이 있습니다. 캐시 키를 만들 때 인자를 문자열로 이어 붙이면 서로 다른 객체가 모두 [object Object]가 되어 충돌하므로, 객체 인자에는 Map이나 WeakMap을 키로 쓰는 편이 안전합니다.
01기본 함수 선언
JavaScript에서 기본 함수 선언 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 기본 함수 선언
function add(a, b) {
return a + b;
}
console.log(add(1, 2));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
02두 값을 더하는 함수
JavaScript에서 두 값을 더하는 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 두 값을 더하는 함수
function sum(...values) {
return values.reduce((total, value) => total + value, 0);
}
console.log(sum(1, 2, 2));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
03기본값 매개변수
JavaScript에서 기본값 매개변수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 기본값 매개변수
function makeCounter() {
let current = 0;
return () => ++current;
}
const next = makeCounter();
console.log(next(), next());매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
04가변 인자 합계
JavaScript에서 가변 인자 합계 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 가변 인자 합계
const steps = [(v) => v + 1, (v) => v * 2];
console.log(steps.reduce((v, fn) => fn(v), 4));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
05객체 또는 구조체 반환
JavaScript에서 객체 또는 구조체 반환 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 객체 또는 구조체 반환
function add(a, b) {
return a + b;
}
console.log(add(5, 2));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
06람다 함수
JavaScript에서 람다 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 람다 함수
function sum(...values) {
return values.reduce((total, value) => total + value, 0);
}
console.log(sum(1, 2, 6));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
07클로저 카운터
JavaScript에서 클로저 카운터 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 클로저 카운터
function makeCounter() {
let current = 0;
return () => ++current;
}
const next = makeCounter();
console.log(next(), next());매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
08재귀 팩토리얼
JavaScript에서 재귀 팩토리얼 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 재귀 팩토리얼
const steps = [(v) => v + 1, (v) => v * 2];
console.log(steps.reduce((v, fn) => fn(v), 8));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
09고차 함수 map
JavaScript에서 고차 함수 map 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 고차 함수 map
function add(a, b) {
return a + b;
}
console.log(add(9, 2));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
10조건 함수 predicate
JavaScript에서 조건 함수 predicate 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 조건 함수 predicate
function sum(...values) {
return values.reduce((total, value) => total + value, 0);
}
console.log(sum(1, 2, 10));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
11정렬용 비교 함수
JavaScript에서 정렬용 비교 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 정렬용 비교 함수
function makeCounter() {
let current = 0;
return () => ++current;
}
const next = makeCounter();
console.log(next(), next());매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
12문자열 파서
JavaScript에서 문자열 파서 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 문자열 파서
const steps = [(v) => v + 1, (v) => v * 2];
console.log(steps.reduce((v, fn) => fn(v), 12));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
13함수 팩토리
JavaScript에서 함수 팩토리 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 함수 팩토리
function add(a, b) {
return a + b;
}
console.log(add(13, 2));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
14메모이제이션
JavaScript에서 메모이제이션 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 메모이제이션
function sum(...values) {
return values.reduce((total, value) => total + value, 0);
}
console.log(sum(1, 2, 14));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
15커링
JavaScript에서 커링 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 커링
function makeCounter() {
let current = 0;
return () => ++current;
}
const next = makeCounter();
console.log(next(), next());매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
16compose 함수
JavaScript에서 compose 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// compose 함수
const steps = [(v) => v + 1, (v) => v * 2];
console.log(steps.reduce((v, fn) => fn(v), 16));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
17제네릭 함수
JavaScript에서 제네릭 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 제네릭 함수
function add(a, b) {
return a + b;
}
console.log(add(17, 2));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
18콜백으로 완료 알림
JavaScript에서 콜백으로 완료 알림 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 콜백으로 완료 알림
function sum(...values) {
return values.reduce((total, value) => total + value, 0);
}
console.log(sum(1, 2, 18));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
19reducer 함수
JavaScript에서 reducer 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// reducer 함수
function makeCounter() {
let current = 0;
return () => ++current;
}
const next = makeCounter();
console.log(next(), next());매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
20파이프라인 함수
JavaScript에서 파이프라인 함수 개념을 코드로 빠르게 확인하는 함수 예제입니다.
JavaScript code
// 파이프라인 함수
const steps = [(v) => v + 1, (v) => v * 2];
console.log(steps.reduce((v, fn) => fn(v), 20));매개변수와 반환값을 함께 읽으면 함수의 책임이 더 선명하게 보입니다.
함수 선언과 호출을 따로 읽으면 매개변수 순서나 반환값을 놓치기 쉽습니다.
정리하며
- this가 필요 없는 콜백에는 화살표 함수를, 메서드에는 일반 함수를 구분해 씁니다
- 설정값이나 캐시를 감추고 싶을 때는 전역 변수 대신 클로저에 담습니다
- 커링과 부분 적용으로 인자를 고정하면 map이나 filter에 바로 넘길 함수가 만들어집니다
- 메모이제이션 캐시 키는 문자열 연결 대신 Map/WeakMap으로 만들어 충돌을 피합니다
더 깊이 들어가고 싶다면 JavaScript 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.