2010-10-12 20 views
12

Her işlev çağrısını bazı günlük kodlarıyla sarmak istiyorum. gibi çıktı üretecektir şey: İdealTüm JavaScript yöntemlerini bir işlevle sarmanın bir yolu var mı?

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

, ben formun bir API istiyorum: Bunun için biraz google'dan

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

, fakat sadece aspect- var gibi görünüyor Giriş yapmak istediğiniz belirli işlevleri ya da herhangi bir şeyi sarmanızı gerektiren yönlendirilmiş çözümler. Küresel kapsamdaki her işlev için geçerli olan bir şey istiyorum (kendiliğinden açıkça).

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

    func_to_run(); 

} 

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

runner(test) 
+0

Yapmak için çağrılar n işlevi (window.alert gibi) veya sadece kullanıcı tanımlı işlevler gibi? –

+0

İdeal olarak, her şey. Daha sonra aramak, sıralamak ve filtrelemek için bir şeyler yazabilirim. – blake8086

cevap

10

Basit yaklaşım

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

Notlar Bu yalnızca küresel işlevleri işleme
çalıştırmak gerekir geri almak için bu

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

gibi bir şey olurdu, ancak kolayca uzatabilirsiniz belirli nesneleri veya yöntemleri işlemek için ..

+0

Oldukça tatlı, bu bana başlamak için fazlasıyla yeterli. Teşekkürler! – blake8086

+0

@blake, hoşgeldiniz .. –

+1

Eğer Globally scoped işlevlerinizi 'function myFunction() {...}' veya 'var myFunction = function() {...}' olarak tanımlarsanız, bu işe yaramaz. IE8 veya aşağısı (ancak IE9 beta sürümünde var) çünkü numaralandırılmayacaklar. Bunun IE8 veya altında çalışması için, işlevlerinizi 'this.myFunction = function() {...}' veya 'window.myFunction = function() {...}' olarak tanımlamanız gerekir. – gilly3

0

Belki parametre olarak yürütmek için işlev geçmesi için bir işlev olabilir?