2016-05-23 111 views
0

我试图写一个返回可以两次调用函数的函数(和所要加在一起的结果),但不超过两次的函数。同样结果必须是isNan as函数返回它只能被调用2次

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

你的第一个段落的最后一句如果函数被调用3次未完成:) – Aaron

回答

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中一个 “功能[即]返回一个函数” 被称为闭合

万一传进来的函数应该接受的参数,你可以用它代替调用运营商.apply方法:

return func.apply(null, arguments); 
// ... 
var allReturns = twice(function(foo) { 
    return 4 * (foo || 1); 
}, 0); 

// allReturns(8) + allReturns(3); 
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。

+0

,它应该打印最后一个为未定义,因为功能应该是能够调用的只有两次。另外,我不知道“收益”是什么,但我确定了。不能使用(练习的一部分) – learningcoding

+0

@learningcoding然后你应该使用i <2而不是i <= 2。 – Colliot

相关问题