函数返回一个只能被调用2次的函数

时间:2016-05-23 22:02:00

标签: javascript callback

我正在尝试编写一个函数,该函数返回一个可以调用两次的函数(并且其结果将被加在一起),但不会超过两次。结果也必须是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();  

有什么建议吗?谢谢!

2 个答案:

答案 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;

result12

Chrome,Edge,Firefox,Opera和NodeJS现在支持

生成器