JavaScript:创建接受回调作为输入并返回函数的函数;输出取决于调用次数

时间:2019-06-11 16:16:19

标签: javascript callback

我的代码的目标是:

编写一个函数“一次”,该函数接受回调作为输入并返回一个函数。第一次调用返回的函数时,它应调用回调并返回该输出。如果再调用一次,则无需再次调用该回调,而只是从第一次调用时返回输出值。

我尝试了以下代码:

const once = (inputFunc) => {

  let invCount = 0; 
  let firstCallOutput; 

  return function (num) {
    invCount ++; 

    if (invCount === 1){

      firstCallOuput = inputFunc(num); 
      return inputFunc(num); 
    }

    else {
      return firstCallOuput; 
    }
  }
}

const addByTwoOnce = once(function(num) {
  return num + 2;
});


// UNCOMMENT THESE TO TEST YOUR WORK!
console.log(addByTwoOnce(5));  //should log 7
console.log(addByTwoOnce(10));  //should log 7
console.log(addByTwoOnce(9001));  //should log 7

在所有三种情况下,我的代码控制台都会注销正确的值(7)。但是它无法通过2/3的测试规格。

enter image description here

我在做什么错?如何通过两个测试规格?

1 个答案:

答案 0 :(得分:1)

这是一个简化的const lerp = ((v1: CesiumTypes, v2: CesiumTypes, t: number): CesiumTypes => { if (isCartographic(v1) && isCartographic(v2)) { return carthographicLerp(v1, v2, t); } if (isCartesian3(v1) && isCartesian3(v2)) { return cartesianLerp(v1, v2, t); } if (isHeadingPitchRoll(v1) && isHeadingPitchRoll(v2)) { return headingPitchRollLerp(v1, v2, t); } throw new Error("arguments don't match"); }) as typeof carthographicLerp & typeof cartesianLerp & typeof headingPitchRollLerp; 函数-

once

如果要防止呼叫站点设置备忘录,可以将备忘录设置为局部变量而不是参数-

const once = (f, memo) => x =>
  memo === undefined
    ? (memo = f(x), memo)
    : memo

const addTwo = x =>
  x + 2

const addTwoOnce =
  once(addTwo)

console.log(addTwoOnce(5))  //should log 7
console.log(addTwoOnce(10))  //should log 7
console.log(addTwoOnce(9001))  //should log 7

或者您可能想防止用户提供的函数返回const once = f => { let memo return x => memo === undefined ? (memo = f(x), memo) : memo } 的可能性。这些都是您可以做出的选择,而对代码的语义结构的影响却很小-

undefined

相关:const once = f => { let hasRun = false let memo return x => hasRun ? memo : (hasRun = true, memo = f(x), memo) } 将返回一个常量值,而不管其输入-

constant


相关:const constant = x => _ => x const always7 = constant(7) console.log(always7(5)) //should log 7 console.log(always7(10)) //should log 7 console.log(always7(9001)) //should log 7将为每个唯一输入缓存一个值,如果之前没有看到输入,则仅重新计算memoise-

f