Moim celem w poniższym kodzie jest, aby każda funkcja przekazana do fn była wywoływana TYLKO raz. na przykład wynik zwraca 5, a powtórzone wywołanie poniżej również powinno zwrócić tę samą liczbę. To, co mam w tej chwili, zwraca nowy numer zamiast tego samego.

function once(fn) {
    var done = false;
    
    return function () {
        if (!done) {
            done = true;
            return fn.apply(this, arguments);
        } else if (done) {
            return fn.apply(this, arguments);
        }
    };
    
}

function add(x, y) {
    return x + y;
}

var addOnce = once(add);
var result = addOnce(2, 3);
result = addOnce(4, 4);
1
Alex C. 5 grudzień 2018, 11:45

1 odpowiedź

Najlepsza odpowiedź

Aby uzyskać tę samą wartość, możesz przechowywać wartość i zwracać ją przy każdym wywołaniu.

function once(fn) {
    var done = false,
        value;

    return function() {
        if (!done) {
            done = true;
            value = fn.apply(this, arguments);
        }
        return value;
    };
}

function add(x, y) {
    return x + y;
}

var addOnce = once(add);

console.log(addOnce(2, 3)); // 5
console.log(addOnce(4, 4)); // 5
2
Nina Scholz 5 grudzień 2018, 11:56