JavaScript에서 "함수는 일급 객체이다"라는 개념을 설명하기 위해 작성.
- 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
이름이 없는 값을 직접 코드에 작성하는 것을 말한다.
예를 들어 let num = 5;에서 5가 무명의 리터럴이다.
리터럴을 딱 이렇게 생각해보자const x = "이곳에 위치할 수 있다.";
const z = function() {}; // 함수 이름이 없기 때문에 무명의 리터럴이라고 하는것이다.
프로그램이 실제로 실행되는 시점에 만들어진다는 의미이다.
코드가 작성된 시점이 아니라, 실제로 그 코드가 실행되는 순간에 메모리에 생성된다.
아래 예시 코드에서 makeCounter 함수가 호출될 때마다 새로운 함수가 그 순간(런타임)에 생성되는 것을 말한다.
즉, 이름 없이 값을 직접 쓰고(무명의 리터럴), 그 값이 프로그램이 실행되는 순간에 만들어진다(런타임에 생성)는 의미이다.
컴파일 타임은 프로그램이 실행되기 전, 소스 코드가 기계어로 변환되는 시점을 말한다. 이때 생성되거나 결정되는 것들을 '컴파일 타임에 생성된다' 또는 '정적(static)으로 생성된다'고 표현한다.
컴파일 타임: 소스코드에 직접 작성된 상수, 클래스 정의 등
런타임: 사용자 입력에 따른 값, 함수 실행 결과 등
// 1. 무명의 리터럴로 생성: 함수를 이름 없이 변수에 직접 할당
const increase = function (num) {
return ++num;
}
const decrease = function (num) {
return --num;
}
// 2. 자료구조(객체)에 저장: 함수를 객체의 프로퍼티로 저장
const auxs = { increase, decrease };
// 3. 함수의 매개변수로 전달: aux 매개변수로 함수를 전달받음
function makeCounter(aux) {
let num = 0;
// 4. 함수의 반환값으로 함수를 사용: 새로운 함수를 생성하여 반환
return function () {
num = aux(num); // 전달받은 함수(aux)를 실행
return num;
};
}
// makeCounter 함수에 increase 함수를 전달하여 새로운 함수 생성
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2
// makeCounter 함수에 decrease 함수를 전달하여 새로운 함수 생성
const decreaser = makeCounter(auxs.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2
일급객체란? 이라고 물어본다면?
함수를 일반 객체처럼 변수에 할당할 수 있고, 다른 함수의 매개변수로 전달하거나 반환값으로 사용할 수 있으며, 객체의 프로퍼티로도 할당할 수 있는 성질!
JavaScript에서 "함수는 일급 객체이다" => 함수를 객체처럼 사용가능하다.
왜? 유연성과 재사용성을 위해!
개념 및 코드 참고: 모던 자바스크립트 Deep Dive