2010-10-12 11 views
12

मैं कुछ लॉगिंग कोड के साथ प्रत्येक फ़ंक्शन कॉल को लपेटना चाहता हूं। कुछ ऐसे ही उत्पादन का उत्पादन होगा:क्या कोई फ़ंक्शन के साथ सभी जावास्क्रिप्ट विधियों को लपेटने का कोई तरीका है?

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

आदर्श रूप में, मैं फार्म की एक एपीआई चाहते हैं:

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

मैं इसके लिए काफ़ी googled है, लेकिन ऐसा लगता है वहाँ की तरह केवल aspect- उन्मुख समाधान जो आपको उन विशिष्ट कार्यों को लपेटने की आवश्यकता होती है जिन्हें आप लॉग करना चाहते हैं, या जो भी हो। मुझे ऐसा कुछ चाहिए जो वैश्विक क्षेत्र में हर समारोह पर लागू होता है (स्वयं को छोड़कर, जाहिर है)।

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

    func_to_run(); 

} 

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

runner(test) 
+0

क्या आप निर्मित करने के लिए कॉल लपेटना चाहते हैं I एन फ़ंक्शन (जैसे 'window.alert'), या केवल उपयोगकर्ता परिभाषित फ़ंक्शंस? –

+0

आदर्श रूप से, सबकुछ। मैं बाद में खोजने, क्रमबद्ध करने और फ़िल्टर करने के लिए सामान लिख सकता था। – blake8086

उत्तर

10

एक साधारण दृष्टिकोण इस

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

की तरह कुछ पूर्ववत करने के लिए आप

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

नोट्स
यह केवल वैश्विक कार्यों का प्रबंधन करता चलाने की आवश्यकता होगी, लेकिन आप आसानी विस्तार कर सकते हैं यह विशिष्ट वस्तुओं या विधियों आदि को संभालने के लिए ..

+0

सुंदर मीठा, यह मुझे शुरू करने के लिए पर्याप्त से अधिक है। धन्यवाद! – blake8086

+0

@blake, आपका स्वागत है .. –

+1

यदि आप अपने ग्लोबली स्कॉप्ड फ़ंक्शंस को 'फ़ंक्शन myFunction() {...} 'या' var myFunction = function() {...}' के रूप में परिभाषित करते हैं, तो यह काम नहीं करेगा आईई 8 या उससे नीचे (लेकिन यह आईई 9 बीटा में करता है!) क्योंकि उन्हें गणना नहीं की जाएगी। इसके लिए IE8 या नीचे काम करने के लिए, आपको अपने कार्यों को 'this.myFunction = function() {...} 'या' window.myFunction = function() {...} 'के रूप में परिभाषित करने की आवश्यकता होगी। – gilly3

0

शायद तुम एक समारोह के लिए जो आपको एक पैरामीटर के रूप में निष्पादित करने के लिए समारोह से पारित हो सकता था?

संबंधित मुद्दे

 संबंधित मुद्दे