2016-05-23 35 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

相關問題