2016-05-23 3 views
0

Ich versuche, eine Funktion zu schreiben, die eine Funktion zurückgibt, die zweimal aufgerufen werden kann (und das Ergebnis davon wird addiert werden), aber nicht mehr als zweimal. Auch das Ergebnis muss isNan alsFunktion gibt eine Funktion, die nur 2 mal aufgerufen werden kann

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

Irgendwelche Vorschläge? Vielen Dank!!

+0

Der letzte Satz Ihres ersten Absatzes ist noch nicht fertig :) – Aaron

Antwort

0

Ihre Funktion newFun ruft die übergebene Funktion während jedes Aufrufs zweimal auf. Sie sollten eine Variable verwenden und die Funktionsaufrufe zählen.

Die folgende Funktion prüft die Anzahl der Funktionsaufrufe und gibt 0 zurück, wenn die Funktion zweimal aufgerufen wurde.

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

In JavaScript eine "Funktion [die] gibt eine Funktion" heißt eine Schließung.

Im Fall, dass die übergebene Funktionsargumente akzeptieren sollten Sie die .apply Methode anstelle des Aufrufs Operator verwenden:

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

// allReturns(8) + allReturns(3); 
0

Nach for (var i=0; i<=2; i++), so scheint es, dass Ihre Funktion dreimal aufgerufen werden kann, statt zweimal. Und Sie haben es dreimal in var result=allReturns()+allReturns()+allReturns(); aufgerufen. Wie auch immer, das ist keine große Sache.

Wenn Sie sich Ihr Snippet ansehen, ist das, was Ihnen am nächsten kommt, generator. Das Snippet kann leicht modifiziert werden, wie:

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; 

und result12 ist.

Generator wird jetzt von Chrome, Edge, Firefox, Opera und NodeJS unterstützt.

+0

Wenn die Funktion dreimal aufgerufen wird, sollte sie den letzten als undefiniert ausgeben, da die Funktion nur zweimal aufgerufen werden kann. Ich habe auch keine Ahnung, was "Ertrag" ist, aber ich def. kann das nicht verwenden (Teil einer Übung) – learningcoding

+0

@learningcoding Dann solltest du i <2 anstelle von i <= 2 verwenden. – Colliot

Verwandte Themen