onceCopy function (testFunc) {
const copyFunc = (a) => {
const copyFunc2 = (b) => {
return testFunc(a);
};
return copyFunc2;
};
return copyFunc;
};
因此函数在第一次调用时返回内部函数。
然后返回内部函数的内部函数的第二个调用。
第二个内部函数(第三次调用)实际上返回父函数中传递的参数,并且只使用第二次调用时给出的字符来调用它。
理想情况下,我希望在第一个有意义的调用之后实现我在许多调用中实现的目标。
编辑:是的,对不起,_.once.
编辑:所以第一次调用onceCopy应该保存传递的Func的副本第二次调用应该触发复制并给出输出第三次调用应该给出第二次调用的结果,第四次、第五次、第六次等等也是如此。
我的函数确实这样做,但在第二次调用时,它再次存储一个函数(copyFunc2),但我只是这样做,因为我需要一个地方存储"a"
就像我们有
function multiplyBy3 (a) {return a*3}
然后once copy存储multiplyBy3的副本
const actualFunction = onceCopy(multiplyBy3)
然后在第二次和第三次调用时我想要的
actualFunction(1) = 3actualFunction(66) = 3
所以传递的函数只运行一次
不能解释更多,它在lodash文档。
我不熟悉你试图重新实现的函数,所以如果我误解了,请随时纠正我。要包装一个函数并确保它只在一次被调用,你不需要多个嵌套包装,只需要一个带有一些状态的包装。
您需要跟踪是否已经有要返回的结果(hasResult
),如果是,该结果是什么(result
)。将这两个变量分开,可以在保持代码易于阅读和理解的同时,覆盖result
是undefined
的情况。
function once(wrappedFunction) {
let hasResult = false;
let result;
return (...args) => {
if (hasResult) {
return result;
}
result = wrappedFunction.apply(this, args);
hasResult = true;
return result;
}
}
// An example function to wrap
function multiply(a, b) {
return a * b;
}
const demoFunction = once(multiply)
console.log(demoFunction(1, 2)); // 2
console.log(demoFunction(3, 4)); // 2
console.log(demoFunction(5, 6)); // 2
这是你要找的吗?
在后续调用中保留初始函数返回值。我使用了第二个变量called
,以防第一次调用返回undefined,它也应该在随后的调用中返回。
const once = (onceFn) => {
let called;
let value;
return (...args) => {
if (called) return value;
called = true;
return (value = onceFn(...args));
};
};
function multiplyBy3(a) {
return a * 3;
}
const fn = once(multiplyBy3);
console.log(fn(3)); // 9
console.log(fn(66)); // 9
第一次调用函数并获得结果后,创建一个返回结果的新函数,并在调用包装函数时使用它:
const once = fn => {
let func
return (...args) => {
if(func) return func()
const result = fn(...args)
func = () => result
return result
}
}
const multiply = (a, b) => a * b
const demoFunction = once(multiply)
console.log(demoFunction(1, 2)); // 2
console.log(demoFunction(3, 4)); // 2
console.log(demoFunction(5, 6)); // 2