함수는 객체이기 때문에 property를 가질 수 있다.
예를 들어 각 함수는 어떤 문법으로 생성하든 자동으로 length 프로퍼티를 갖는다. 이 때 length는 함수가 받는 인자의 개수를 의미한다.
function foo(a, b) {
// something
}
console.log(foo.length); // 2
언제든지 함수에 사용자 정의 프로퍼티를 추가할 수 있다. 함수에 프로퍼티를 추가해서 결과를 캐싱하여 사용할 수 있는데, 이런 활용 방법을 메모이제이션 패턴
이라고 한다.
어떤 정수의 제곱근을 구하는 방법을 메모이제이션 패턴으로 리팩토링 한다면 아래와 같다.
function sqrt(arg) {
// sqrt 함수에 cache라는 프로퍼티가 없으면 빈 객체를 생성한다
if (!sqrt.cache) {
sqrt.cache = {};
}
// sqrt.cache에 arg 값이 없다면 (메모이제이션된 값이 없다면)
if (!.sqrt.cache[arg]) {
return sqrt.cache[arg] = Math.sqrt(arg);
}
// sqrt.cache에 arg 값이 있다면 (메모이제이션된 값이 있다면)
// 연산하지 않고 캐시 값을 바로 리턴한다
return sqrt.cache[arg];
}
메모이제이션의 목표는 속도로 속도를 위해 저장공간(메모리)를 사용한다.
실행 시간이 줄어드는 장점이 있지만 메모리를 버리기 때문에 입력 범위가 제한된 함수에 사용해야한다.