반응형
자바스크립트에서 함수는 동적으로 할당할 수 있다.
이것은 자기 자신도 가능하다.
함수가 자기 자신을 재정의하면 최초로 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!
반응형
'개발 > JavaScript' 카테고리의 다른 글
자바스크립트 - 객체 속성 기술자 (Object Property Descriptor) (0) | 2021.10.04 |
---|---|
자바스크립트 - 태그드 템플릿 리터럴 (Tagged Template Literals) (0) | 2021.08.20 |
자바스크립트 Symbol (0) | 2021.08.14 |
자바스크립트 this (0) | 2021.08.11 |
자바스크립트 async await (0) | 2021.08.03 |
댓글