본문 바로가기
개발/JavaScript

자바스크립트 - 자기 자신을 정의하는 함수 (Lazy Function Definition)

by 피로물든딸기 2021. 8. 17.
반응형

자바스크립트 전체 링크

 

자바스크립트에서 함수는 동적으로 할당할 수 있다.

이것은 자기 자신도 가능하다.

 

함수가 자기 자신을 재정의하면 최초로 A를 실행하고, 이후 B를 실행할 수 있다.

let test = function() {
  console.log("hello!");
  test = function() {
    console.log("world!");
  };
};

test(); // hello!
test(); // world!
test(); // world!

 

첫 번째 test가 hello를 출력하고,  test를 다시 새롭게 정의하였다.

따라서 다음부터는 world가 출력된다.

 

이러한 패턴을 Lazy Function Definition 이라고 한다.

이 패턴을 이용하면 초기화 준비 작업을 한 번만 수행할 수 있다.

초기화 작업 A에 많은 비용이 들고, 이후 계속 그 값이 변경되지 않는다면, 아래와 같이 응용 가능하다.

function sleep(ms) {
  const loopTime = Date.now() + ms;
  while (Date.now() < loopTime) {}
}

function veryExpensiveFunction() {
  sleep(3000);
  return 100;
}

let test = function() {
  let initValue = veryExpensiveFunction();
  test = function() { return initValue; };
  return test();
};

console.log(test()); // 3000ms 후 100 return
console.log(test()); // 즉시 100 return
console.log(test()); // 즉시 100 return

 

이 패턴은 함수가 다른 이름으로 사용된 경우, 재정의된 부분이 아니라 원본 함수의 본문만 실행된다.

anotherTest에 test를 할당하여 실행하면, hello 실행된다.

하지만 test는 world를 출력하는 것으로 변경된 것을 알 수 있다.

let test = function() {
  console.log("hello!");
  test = function() {
    console.log("world!");
  };
};

let anotherTest = test;

anotherTest(); // hello!
anotherTest(); // hello!
anotherTest(); // hello!
test(); // world!
반응형

댓글