闭包挑战:从第一次调用返回相同的输出(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