LeetCode - 2666. Allow One Function Call

henu·2023년 8월 31일
0

LeetCode

목록 보기
25/186
post-thumbnail

Solution

var once = function(fn) {
    let called = false;
    
    return function(...args){
        if(called) {
            return undefined;
        } else {
            called = true;
            return fn(...args);
        }
    }
};

Explanation

JS의 Closure에 관한 문제인 것 같다. 이 개념을 활용해서 풀 수 있었다.
MDN 정의에 따르면

클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다.

once함수는 함수를 리턴하는 함수이다. 즉, once함수가 실행되면 내부 함수가 선언되고 내부 함수를 리턴한다.
여기서 내부 함수가 선언될 때 내부 함수는 어휘적 환경(Lexical Enviornment)를 기억한다.
먼저 선언된 called변수를 기억한다는 것이다.
솔루션의 순서를 정리해보면
1. once함수가 실행되면 called변수가 선언되면서 false가 할당된다. 그리고 내부 함수가 선언되면서 리턴된다. (이때, 어휘적 환경을 기억한다.)
2. 내부 함수가 처음 실행되면 calledfalse이기 때문에 else문이 실행된다. 이때, called변수에 true를 재할당하고 fn(...args)값을 리턴한다.
3. 이후로 실행될때는 calledtrue이기 때문에 항상 undefined를 리턴한다.

0개의 댓글