var once = function(fn) {
let called = false;
return function(...args){
if(called) {
return undefined;
} else {
called = true;
return fn(...args);
}
}
};
JS의
Closure에 관한 문제인 것 같다. 이 개념을 활용해서 풀 수 있었다.
MDN 정의에 따르면클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다.
once함수는 함수를 리턴하는 함수이다. 즉,once함수가 실행되면 내부 함수가 선언되고 내부 함수를 리턴한다.
여기서 내부 함수가 선언될 때 내부 함수는 어휘적 환경(Lexical Enviornment)를 기억한다.
먼저 선언된called변수를 기억한다는 것이다.
솔루션의 순서를 정리해보면
1.once함수가 실행되면called변수가 선언되면서false가 할당된다. 그리고 내부 함수가 선언되면서 리턴된다. (이때, 어휘적 환경을 기억한다.)
2. 내부 함수가 처음 실행되면called가false이기 때문에 else문이 실행된다. 이때,called변수에true를 재할당하고fn(...args)값을 리턴한다.
3. 이후로 실행될때는called가true이기 때문에 항상undefined를 리턴한다.