2011-02-17 18 views
71

क्या कोई फ़ंक्शन आउटपुट कंसोल.लॉग स्टेटमेंट बनाने का कोई तरीका है जब इसे किसी वैश्विक हुक को पंजीकृत करके कहा जाता है (यानी, वास्तविक फ़ंक्शन को संशोधित किए बिना) या किसी अन्य माध्यम से ?प्रत्येक फ़ंक्शन में स्वचालित रूप से console.log जोड़ना

+0

उत्कृष्ट प्रश्न, मुझे यह जानना अच्छा लगेगा कि यह संभव है या नहीं, लेकिन मुझे पूरा यकीन है कि यह नहीं है ... शायद अपने पसंदीदा ब्राउज़र के लिए जेएस इंजन में इसे जोड़ने के लिए एक फीचर अनुरोध जोड़ें ? :-) – Endophage

+0

बिल्कुल सही सवाल, मुझे इस तरह की कुछ चाहिए – mjimcua

उत्तर

52

यहाँ अपनी पसंद के समारोह के साथ वैश्विक नाम स्थान में सभी कार्यों को बढ़ाने के लिए एक रास्ता है:

function augment(withFn) { 
    var name, fn; 
    for (name in window) { 
     fn = window[name]; 
     if (typeof fn === 'function') { 
      window[name] = (function(name, fn) { 
       var args = arguments; 
       return function() { 
        withFn.apply(this, args); 
        return fn.apply(this, arguments); 

       } 
      })(name, fn); 
     } 
    } 
} 

augment(function(name, fn) { 
    console.log("calling " + name); 
}); 

एक नीचे की ओर है कि augment बुला के बाद बनाए गए कोई प्रकार्य अतिरिक्त व्यवहार होगा।

+0

क्या यह फ़ंक्शन के रिटर्न वैल्यू को सही तरीके से संभालता है? – SunnyShah

+2

@SunnyShah नहीं यह नहीं करता है: http://jsfiddle.net/Shawn/WnJQ5/ लेकिन यह एक करता है: http://jsfiddle.net/Shawn/WnJQ5/1/ हालांकि मुझे यकीन नहीं है कि यह काम करेगा सभी मामलों ... अंतर बदल रहा है 'fn.apply (यह, तर्क); 'to' fn.apply (यह, तर्क); ' – Shawn

+2

@Shawn @SunnyShah फिक्स्ड। सबसे व्यस्त कार्य में 'वापसी' जोड़ने की आवश्यकता है। –

-2

आप वास्तव में लोड होने वाली सभी चीज़ों के लिए console.log पर अपना स्वयं का फ़ंक्शन संलग्न कर सकते हैं।

console.log = function(msg) { 
    // Add whatever you want here 
    alert(msg); 
} 
+12

क्या मुझे अपना डाउनवोट समझा देना है? – vladkras

+0

यह 100% सही है –

-1

यहां कुछ जावास्क्रिप्ट है जो जावास्क्रिप्ट में प्रत्येक फ़ंक्शन में console.log जोड़ता है; Regex101 पर इसके साथ खेलते हैं:

$re = "/function (.+)\\(.*\\)\\s*\\{/m"; 
$str = "function example(){}"; 
$subst = "$& console.log(\"$1()\");"; 
$result = preg_replace($re, $subst, $str); 

यह एक 'त्वरित और गंदी हैक' है, लेकिन मैं इसे डिबगिंग के लिए उपयोगी पाते हैं। यदि आपके पास बहुत सारे फ़ंक्शन हैं, तो सावधान रहें क्योंकि इससे बहुत सारे कोड जोड़े जाएंगे। साथ ही, RegEx सरल है और शायद अधिक जटिल फ़ंक्शन नाम/घोषणा के लिए काम नहीं कर सकता है।

1

यदि आप अधिक लक्षित लॉगिंग चाहते हैं, तो निम्न कोड किसी विशेष ऑब्जेक्ट के लिए फ़ंक्शन कॉल लॉग करेगा। आप ऑब्जेक्ट प्रोटोटाइप को भी संशोधित कर सकते हैं ताकि सभी नए उदाहरण लॉगिंग भी हो सकें। मैंने इसके बजाय ऑब्जेक्ट.getOwnPropertyNames का उपयोग किया ... में, यह ईसीएमएस्क्रिप्ट 6 कक्षाओं के साथ काम करता है, जिसमें संख्यात्मक तरीके नहीं हैं।

function inject(obj, beforeFn) { 
    for (let propName of Object.getOwnPropertyNames(obj)) { 
     let prop = obj[propName]; 
     if (Object.prototype.toString.call(prop) === '[object Function]') { 
      obj[propName] = (function(fnName) { 
       return function() { 
        beforeFn.call(this, fnName, arguments); 
        return prop.apply(this, arguments); 
       } 
      })(propName); 
     } 
    } 
} 

function logFnCall(name, args) { 
    let s = name + '('; 
    for (let i = 0; i < args.length; i++) { 
     if (i > 0) 
      s += ', '; 
     s += String(args[i]); 
    } 
    s += ')'; 
    console.log(s); 
} 

inject(Foo.prototype, logFnCall); 
संबंधित मुद्दे