2011-10-29 27 views
50

के माध्यम से प्रथम श्रेणी के तर्क के रूप में console.log को तर्क पास करें, एक अनिर्दिष्ट संख्या में तर्कों की एक निर्दिष्ट संख्या लेती है और उनकी सामग्री को एक पंक्ति में डंप करती है।प्रॉक्सी फ़ंक्शन

क्या कोई तरीका है कि मैं एक ऐसा कार्य लिख सकता हूं जो उस व्यवहार को बनाए रखने के लिए console.log पर सीधे तर्क भेजता है? उदाहरण के लिए:

function log(){ 
    if(console){ 
     console.log(arguments); 
    } 
} 

arguments के बाद से एक सरणी है और console.log कि सरणी की सामग्री को डंप हो जाएगा:

function log(){ 
    if(console){ 
     /* code here */ 
    } 
} 

यह रूप में एक ही नहीं होगा। न ही यह वही होगा:

function log(){ 
    if(console){ 
     for(i=0;i<arguments.length;console.log(arguments[i]),i++); 
    } 
} 

चूंकि यह सब कुछ अलग-अलग पंक्तियों में प्रिंट करेगा। बिंदु console.log के व्यवहार को बनाए रखना है, लेकिन प्रॉक्सी फ़ंक्शन log के माध्यम से।

+ ---

मैं एक समाधान मैं भविष्य में सभी कार्यों के लिए आवेदन कर सकता है के लिए देख रहा था (एक समारोह बरकरार तर्क की हैंडलिंग रखने के लिए एक प्रॉक्सी बनाएँ)। यदि ऐसा नहीं किया जा सकता है, तो मैं console.log विशिष्ट उत्तर स्वीकार करूंगा।

उत्तर

77

यह करना चाहिए ..

function log() { 
    if(typeof(console) !== 'undefined') { 
     console.log.apply(console, arguments); 
    } 
} 

बस (spread ऑपरेटर और rest मानकों का प्रयोग करके - हालांकि arguments प्रसार साथ सीधे इस्तेमाल किया जा सकता है) एक और विकल्प जोड़ने

function log(...args) { 
    if(typeof(console) !== 'undefined') { 
     console.log(...args); 
    } 
} 
+3

यह क्रोम/सफारी में काम नहीं करता है। यह एक "अवैध आमंत्रण" त्रुटि फेंकता है। – aditya

+3

@aditya, अद्यतन कोड .. मैं सही संदर्भ का उपयोग नहीं कर रहा था .. आपको 'कंसोल' को लागू करने के लिए 'इस' तर्क के रूप में पास करने की आवश्यकता है .. –

+0

बहुत बढ़िया। वह काम किया। धन्यवाद! – aditya

3

हां।

console.log.apply(null,arguments); 

हालांकि, आप के माध्यम से तर्क वस्तु और इसे से एक नियमित सरणी बनाने के लिए, लेकिन इसके अलावा कि तुम कैसे करते है पाश करना पड़ सकता है।

+1

यह क्रोम/सफारी में काम नहीं करता। यह फायरबग में काम करता है, लेकिन यहां एक क्रॉस-ब्राउज़र समाधान की तलाश है। – aditya

+0

'args = []; के लिए (i = 0; i

+0

नहीं। जाहिर है, 'console.log.apply' पर कोई भी कॉल एक अवैध आमंत्रण त्रुटि फेंकता है। – aditya

8

html5boilerplate कोड से एक अच्छा उदाहरण है जो लपेटता है console.log एक ही तरीके से यह सुनिश्चित करने के लिए कि आप किसी भी ब्राउज़र को बाधित नहीं करते हैं जो इसे पहचान नहीं पाता है। यह एक इतिहास भी जोड़ता है और console.log कार्यान्वयन में किसी भी अंतर को दूर करता है।

यह पॉल आयरिश द्वारा विकसित किया गया था और उसने here पर एक पोस्ट लिखा है।

मैं नीचे प्रासंगिक कोड पेस्ट किया है, यहाँ परियोजना में फाइल करने के लिए एक कड़ी है: https://github.com/h5bp/html5-boilerplate/blob/master/js/plugins.js

// usage: log('inside coolFunc', this, arguments); 
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ 
window.log = function(){ 
    log.history = log.history || []; // store logs to an array for reference 
    log.history.push(arguments); 
    if(this.console) { 
    arguments.callee = arguments.callee.caller; 
    var newarr = [].slice.call(arguments); 
    (typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr)); 
    } 
}; 

// make it safe to use console.log always 
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}}((function(){try {console.log();return window.console;}catch(err){return window.console={};}})());