2010-10-12 12 views
12

Chcę zawijać każde wywołanie funkcji za pomocą kodu logowania. Coś, co będzie produkować wyjście jak:Czy istnieje sposób na zawijanie wszystkich metod JavaScript za pomocą funkcji?

func1(param1, param2) 
func2(param1) 
func3() 
func4(param1, param2) 

Idealnie chciałabym API w postaci:

function globalBefore(func); 
function globalAfter(func); 

Mam google sporo za to, ale wydaje się, że istnieje tylko aspect- ukierunkowane rozwiązania, które wymagają zawijania określonych funkcji, które chcesz rejestrować, lub cokolwiek innego. Chcę czegoś, co dotyczy każdej funkcji w zasięgu globalnym (oczywiście z wyjątkiem samej siebie).

+0

Czy chcesz zawijać połączenia do wbudowanego n funkcja (np. 'window.alert'), czy po prostu funkcje zdefiniowane przez użytkownika? –

+0

Idealnie wszystko. Mógłbym pisać rzeczy do wyszukiwania, sortowania i filtrowania później. – blake8086

Odpowiedz

10

Prostym rozwiązaniem byłoby coś takiego

var functionPool = {} // create a variable to hold the original versions of the functions 

for(var func in window) // scan all items in window scope 
{ 
    if (typeof(window[func]) === 'function') // if item is a function 
    { 
    functionPool[func] = window[func]; // store the original to our global pool 
    (function(){ // create an closure to maintain function name 
     var functionName = func; 
     window[functionName] = function(){ // overwrite the function with our own version 
     var args = [].splice.call(arguments,0); // convert arguments to array 
     // do the logging before callling the method 
     console.log('logging: ' + functionName + '('+args.join(',')+')'); 
     // call the original method but in the window scope, and return the results 
     return functionPool[functionName].apply(window, args); 
     // additional logging could take place here if we stored the return value .. 
     } 
     })(); 
    } 
} 

Aby cofnąć trzeba by uruchomić

for (func in functionPool) 
    window[func] = functionPool[func]; 

Uwagi
uchwyty to tylko funkcje globalne, ale można łatwo rozszerzyć do obsługi określonych obiektów lub metod itp.

+0

Całkiem słodko, to więcej niż wystarcza, żeby zacząć. Dzięki! – blake8086

+0

@blake, zapraszam .. –

+1

Jeśli zdefiniujesz swoje funkcje o zasięgu globalnym jako 'function myFunction() {...}' lub 'var myFunction = function() {...}', to nie zadziała IE8 lub niższy (ale działa w wersji IE9 beta!), Ponieważ nie zostaną wyliczone. Aby to działało w IE8 lub poniżej, będziesz musiał zdefiniować swoje funkcje zamiast 'this.myFunction = function() {...}' lub 'window.myFunction = function() {...}'. – gilly3

0

Może masz funkcję, do której przechodzą do wykonywania funkcji jako parametr:

function runner(func_to_run) { 
    alert('about to run ' + func_to_run.name); 

    func_to_run(); 

} 

function test() { 
    alert ('in test'); 
} 

runner(test) 
Powiązane problemy