2016-05-23 15 views
0

2回呼び出すことができる関数を返す関数を作成しようとしていますが、その結果は2回以下です。結果はisNanとして関数は、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

最初の段落の最後の文は終了していません:) – Aaron

答えて

0

newFun関数は、呼び出しごとに渡された関数を2回呼び出します。変数を使用して、関数呼び出しをカウントする必要があります。

次の関数は、関数呼び出しの回数をチェックし、関数が2回呼び出されたときに0を返します。 JavaScriptで

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); 

「関数関数を返すを[することを」閉鎖呼ばれます。渡された関数は、あなたの代わりに呼び出し演算子の.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();で3回それを呼び出しました。とにかく、これは大きな問題ではありません。

あなたのスニペットを見ると、あなたの心に最も近いものは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

関数が3回呼び出された場合、関数は2回呼び出すことができるため、最後のものは未定義として出力されます。また、私は「収率」が何であるか分かりませんが、私は駄目です。それを使うことはできません(練習の一部) – learningcoding

+0

@learningcoding次に、i <= 2の代わりにi <2を使用してください。 – Colliot

関連する問題