我正在尝试编写一个函数,该函数返回一个可以调用两次的函数(并且其结果将被加在一起),但不会超过两次。结果也必须是isNan as
function twice(func) {
var newFun=function(){
for (var i=0; i<=2; i++){
func();
}
}
return newFun;
}
allReturns = twice(function() {
return 4
});
var result=allReturns()+allReturns()+allReturns();
有什么建议吗?谢谢!
答案 0 :(得分:0)
您的newFun
函数在每次调用期间调用传递的函数两次。您应该使用变量并计算函数调用。
以下函数检查函数调用的计数,并在调用函数两次时返回0
。
function twice(func, exceededReturnValue) {
// the following variable is local to the `twice` function
var called = 0;
// return a function that *remembers* the declared variable
return function() {
if ( called == 2 ) {
console.warn('the function has already been called twice');
return exceededReturnValue;
}
called++;
return func();
}
}
var allReturns = twice(function() {
return 4
}, 0);
在JavaScript中,&#34;函数[that]返回一个函数&#34;被称为闭包。
如果传递的函数应该接受参数,则可以使用.apply
方法而不是调用操作符:
return func.apply(null, arguments);
// ...
var allReturns = twice(function(foo) {
return 4 * (foo || 1);
}, 0);
// allReturns(8) + allReturns(3);
答案 1 :(得分:0)
根据for (var i=0; i<=2; i++)
,似乎你的函数可以被调用三次而不是两次。你确实在var result=allReturns()+allReturns()+allReturns();
中调用了三次。无论如何,这不是什么大问题。
看一下你的片段,你心中最接近的是generator。该片段可以稍微修改为:
function twice(func) {
var newFun = function*() {
for (var i = 0; i <= 2; i++) {
yield func();
}
}
return newFun;
}
var allReturns = twice(function() {
return 4
})(); // Remember the `()` here. What `twice` returns is a function (in my case a generator), and have to be executed.
var result=allReturns.next().value+allReturns.next().value+allReturns.next().value;
且result
为12
。
生成器。