2017-01-05 10 views
4

Представьте себе простую рекурсивную функцию, которую мы пытаемся обернуть для ввода и вывода инструмента.Прокси-рекурсивная функция

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

Однако, это регистрирует только входные и выходные данные на верхнем уровне. Я хочу найти способ, чтобы count вызывал инструментальную версию, когда она повторяется.

+2

Я считаю, что вам нужно переопределить 'count'. Поскольку JavaScript имеет лексическую область действия, на самом деле вы ничего не можете сделать, чтобы заставить 'count' внутри функции ссылаться на что-то другое (кроме переопределения' count'). Но я был бы счастлив, если бы оказался ошибочным :) –

ответ

-1

Функция вызывает count, так что это то, что вам нужно обернуть. Вы можете сделать что-либо

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

или

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

Для всего остального, вам нужно будет динамически вводить функцию для рекурсивного вызова в инструментированной функцию, подобно тому, как Y Combinator делает это.