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
를 리턴한다.