Функция для кэширования возвращаемого значения аргумента
Я хочу написать функцию once
которая принимает обратный вызов в качестве ввода и возвращает функцию. Когда возвращаемая функция вызывается в первый раз, она должна вызвать обратный вызов и вернуть этот вывод. Если он вызывается в любое дополнительное время, вместо повторного вызова обратного вызова он просто вернет выходное значение с момента первого вызова.
Ниже то, что я пытался сделать. Но я не получаю результаты, как я ожидал. Мне нужно понять эту концепцию.
function once(func) {
let num;
function retFunc(x){
num = func(x);
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
Ответы
Ответ 1
Вы должны назначать num = func(x)
тогда, когда num
не undefined
то есть при самом первом вызове retFunc
:
function once(func) {
let num;
function retFunc(x){
if (num === undefined) {
num = func(x);
}
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
Ответ 2
Вы должны только вызывать функцию и присваивать num
если она не определена, в противном случае вы перезаписываете ее каждый раз:
function once(func) {
let num;
function retFunc(x) {
num = (num === undefined) ? func(x) : num
return num;
}
return retFunc;
}
function addByTwo(input) {
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
Ответ 3
Что вам не хватает, так это удаление исходной функции после первого выполнения. Вы должны изменить свой код следующим образом:
function once(func) {
let num;
function retFunc(x){
if (func)
num = func(x);
func = null;
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
Таким образом, вы удаляете функцию после первого использования и сохраняете результат.
Ответ 4
Это твоя проблема
function retFunc(x){
num = func(x);
return num;
}
Ты всегда func(x)
. Добавьте условие if, чтобы проверить, является ли num
undefined
перед вызовом func(x)
.
Ответ 5
другой подход: переписать вызов func
нет флагов, проверьте, если результат не определен или что-то требуется
function once(func) {
let num;
let internalFn = function(x) {
num = func(x);
internalFn = function(x) {
return num;
}
return num;
}
function retFunc(x){
return internalFn(x);
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6