闭包返回应该的内容,并且也未定义

时间:2018-09-21 15:59:15

标签: javascript closures

我正在练习闭包,现在我的工作是:

  

编写一个函数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有关,看起来很明显。

Here in JS Bin

1 个答案:

答案 0 :(得分:1)

函数<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="container"> <h3>SELECT YOUR VEHICLE</h3> <br> <ul id="SelectJeep"> <a href="link1.html" class="clickme"> <li id="t-1" class="active"> <h1>MANCHE</h1> </li> </a> <a href="link2.html" class="clickme"> <li id="t-2"> <h1>ASCENDER</h1> </li> </a> <a href="link3.html" class="clickme"> <li id="t-3"> <h1>CRUSADER</h1> </li> </a> <a href="link4.html" class="clickme"> <li id="t-4"> <h2>COMING SOON</h2> </li> </a> </ul> </div>返回另一个函数addByX。但是adding不会返回任何内容。它只是记录。返回值是不确定的。

我认为您希望它看起来像这样:

adding

所以它“起作用”的原因是因为回调是在控制台上打印的,而不是您在哪里调用的。