我的代码的目标是:
编写一个函数“一次”,该函数接受回调作为输入并返回一个函数。第一次调用返回的函数时,它应调用回调并返回该输出。如果再调用一次,则无需再次调用该回调,而只是从第一次调用时返回输出值。
我尝试了以下代码:
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的测试规格。
我在做什么错?如何通过两个测试规格?
答案 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