Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
闭包挑战:从第一次调用返回相同的输出(Javascript)_Javascript_Closures - Fatal编程技术网

闭包挑战:从第一次调用返回相同的输出(Javascript)

闭包挑战:从第一次调用返回相同的输出(Javascript),javascript,closures,Javascript,Closures,我面临以下挑战描述: 编写一次函数,接受回调作为输入并返回一个函数。当第一次调用返回的函数时,它应该调用回调并返回该输出。如果再调用多次,它只返回第一次调用时的输出值,而不是再次调用回调 提供给您的代码是: function addByX(x) { return function(num) { return num + x; }; } var addByTwo = addByX(2); function once(func) { // ADD CODE HERE } v

我面临以下挑战描述:

编写一次函数,接受回调作为输入并返回一个函数。当第一次调用返回的函数时,它应该调用回调并返回该输出。如果再调用多次,它只返回第一次调用时的输出值,而不是再次调用回调

提供给您的代码是:

function addByX(x) {
  return function(num) {
    return num + x;
  };
}

var addByTwo = addByX(2);

function once(func) {
  // ADD CODE HERE
}

var onceFunc = once(addByTwo);

// UNCOMMENT THESE TO TEST YOUR WORK!
console.log(onceFunc(4));  //should log 6
console.log(onceFunc(10));  //should log 6
console.log(onceFunc(9001));  //should log 6

我可以让代码返回您希望它返回的内容(6,12,9003),但我无法让它继续记录6。onceFunc本身等于addByTwo,x等于2,因此传入onceFunc的任何数字都充当n。我是否需要让它将第一次返回的6或n=4保存到一个变量中?

可能有更好的解决方案,但这就是我想到的。我尝试向代码中添加注释以解释其作用,但如果您有任何其他问题,请告诉我:


也许有更好的解决办法,但这就是我想到的。我尝试向代码中添加注释以解释其作用,但如果您有任何其他问题,请告诉我:


闭包部分很好,但是如果回调第一次返回0,请查看是否可以添加逻辑以防止回调被多次调用。不确定你是否被标记在这一点上,但祝你好运,说得好。你可以用两种方法处理这个问题<代码>结果=结果===未定义?func(num):结果,但如果func返回undefined,则存在陷阱。或者,您可以添加另一个作用域变量
调用
最初设置为false,在调用
func
后设置为true。然后勾住这个,知道该返回什么。这取决于您对调用函数的信任程度。闭包部分很好,但是如果回调第一次返回0,请查看是否可以添加逻辑以防止回调被多次调用。不确定你是否被标记在这一点上,但祝你好运,说得好。你可以用两种方法处理这个问题<代码>结果=结果===未定义?func(num):结果,但如果func返回undefined,则存在陷阱。或者,您可以添加另一个作用域变量
调用
最初设置为false,在调用
func
后设置为true。然后勾住这个,知道该返回什么。这取决于您对调用函数的信任程度。
function addByX(x) {
  return function(num) {
    return num + x;
  };
}

var addByTwo = addByX(2);

function once(func) {
    // a variable which is scoped to the "once" function
  // this means you can't access "result" outside of the function
    var result;
  return function(num){
    // since this function is scoped inside "once", it has access to result
    // set the result to itself (if aleady called), or the value returned from func
    result = result || func(num);

    // return the result
    return result;
  }
}

var onceFunc = once(addByTwo);

// UNCOMMENT THESE TO TEST YOUR WORK!
console.log(onceFunc(4));  //should log 6
console.log(onceFunc(10));  //should log 6
console.log(onceFunc(9001));  //should log 6