2017-01-05 19 views
4

Stellen Sie sich eine einfache rekursive Funktion vor, die wir umschließen wollen, um den Ein- und Ausgang des Instruments zu steuern.Proxys einer rekursiven Funktion

// A simple recursive function. 
 
const count = n => n && 1 + count(n-1); 
 

 
// Wrap a function in a proxy to instrument input and output. 
 
function instrument(fn) { 
 
    return new Proxy(fn, { 
 
    apply(target, thisArg, argumentsList) { 
 
     console.log("inputs", ...argumentsList); 
 
     const result = target(...argumentsList); 
 
     console.log("output", result); 
 
     return result; 
 
    } 
 
    }); 
 
} 
 

 
// Call the instrumented function. 
 
instrument(count)(2);

Dies ist jedoch nur protokolliert den Eingang und Ausgang auf der obersten Ebene. Ich möchte einen Weg finden, count die instrumentierte Version aufzurufen, wenn es recurses.

+2

Ich glaube, Sie müssen 'count' überschreiben. Da JavaScript einen lexikalischen Geltungsbereich hat, gibt es nicht wirklich etwas anderes, was Sie tun können, um "count" innerhalb der Funktion auf etwas anderes verweisen zu lassen (außer das Überschreiben von "count"). Aber ich würde mich freuen, sich als falsch erwiesen zu haben :) –

Antwort

-1

Die Funktion ruft count auf, also müssen Sie sie umbrechen. Sie können tun, entweder

const count = instrument(n => n && 1 + count(n-1)); 

oder

let count = n => n && 1 + count(n-1); 
count = instrument(count); 

Für alles andere würden Sie dynamisch die Funktion für den rekursiven Aufruf in die instrumentierte Funktion, ähnlich wie die Y Combinator tut es injizieren müssen.

Verwandte Themen