Закрытие возвращает то, что предполагается, а также неопределенный - PullRequest
0 голосов
/ 21 сентября 2018

Я практикую замыкания, и моя задача на данный момент:

Написать функцию once, которая принимает обратный вызов в качестве ввода и возвращает функцию.Когда возвращаемая функция вызывается в первый раз, она должна вызвать обратный вызов и вернуть этот вывод.Если он вызывается в любое дополнительное время, вместо повторного вызова обратного вызова он просто возвращает выходное значение с момента первого вызова.

Мой обратный вызов:

const addByX = function (num1) {
    let number = num1;
    function adding(num2) {
        console.log(number + num2);
    }
    return adding;
}
//addByX(2)(8);

let addByTwo = addByX(2);

И моя основная функция:

const once = function (func) {
    let isFirst = true;
    let firstOutput;
    function inside(numberToPass) {
        if (isFirst) {
            firstOutput = func(numberToPass);
            isFirst = false;
            return func(numberToPass);
        } else {
            return firstOutput;
        }
    }
    return inside;
}

Он работает, но когда я его вызываю

const onceFunc = once(addByTwo);
console.log(onceFunc(4));  //should log 6
console.log(onceFunc(10));  //should log 6

, он возвращает мои значения и также не определен.

И я действительноне могу понять с чего бы это.Возможно, если это сработает, мне не следует задавать подобные вопросы, но мне действительно любопытно.Отладчик не мог четко ответить на мой вопрос.Я подозреваю, что это имеет какое-то отношение к console.log, как бы странно это не выглядело.

Здесь, в JS Bin

1 Ответ

0 голосов
/ 21 сентября 2018

Функция addByX возвращает другую функцию, adding.Но adding ничего не возвращает;это просто логи.Его возвращаемое значение не определено.

Я думаю, что вы хотели, чтобы оно выглядело так:

const addByX = function (num1) {
    let number = num1;
    function adding(num2) {
        return number + num2;
    }
    return adding;
}

Так что причина, по которой он "работал", заключается в том, что обратный вызов печатал на консоль, скореечем там, где вы его вызываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...