2016-09-14 18 views
33

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

उदाहरण के लिए:

const callWithTest = callback => callback('test'); 
callWithTest(console.log); // That didn't use to work. 
callWithTest(console.log.bind(console)); // That worked (and works) fine. 

Uncaught TypeError: Illegal invocation in javascript देखें।

हालांकि, हाल ही में मैंने देखा कि console.log() कंसोल के अलावा अन्य ऑब्जेक्ट पर कॉल करने पर भी ठीक काम करता है।

console.log.call(null, 'test'); 

लॉग 'test': उदाहरण के लिए।

कब और क्यों बदल गया? क्या विनिर्देश इसके बारे में कुछ भी कहता है?

लॉगिंग एपीआई सभी की इजाजत दी उन्हें

यह नहीं रह गया है शामिल है कॉलबैक, foreach तरीकों, आदि से निपटने त्रुटि के लिए तर्क के रूप में पारित होने के लिए प्रतिदेय कार्यों की जानी चाहिए:

+1

बीटीडब्ल्यू, ओपेरा (पुराना एक) उम्र के बाद से था ... – Bergi

उत्तर

13

Editor's Draft of Console API कहा करते थे the current version of the specification में।

मैंने सोचा कि क्रोम और नोड.जेएस ने इसे विनिर्देशन में काम करने के लिए बदल दिया है, लेकिन ऐसा लगता है कि यह इससे पहले भी ऐसा काम करता था।

मैं अभी भी उत्सुक हूं जब यह बदल गया और इसका कारण क्या था।

0

मुझे नहीं पता कि परिवर्तन कब किया गया था, लेकिन मुझे पता है कि यह क्यों काम नहीं करता है।

पर विचार करें निम्नलिखित कोड

callWithTest = callback => callback('test'); 
var Demo = function() {this.str = 'demo';} 
Demo.prototype.getStr = function() { return this.str;} 
demo = new Demo(); 
demo.getStr(); // returns 'demo' 
callWithTest(demo.getStr); // returns undefined 
window.str = 'window'; 
callWithTest(demo.getStr); // returns 'window' 

आप कोड का पता लगाने के हैं, तो आप यह है कि जब demo.getStr एक और समारोह के माध्यम से बुलाया जाता है, thiswindow को संदर्भित करता है देखेंगे, और साइन strwindow भीतर परिभाषित नहीं है यह undefined देता है। यदि आपने इसे सीधे या डेमो से बांध दिया है, तो this डेमो को संदर्भित करता है और इस प्रकार यह 'डेमो' देता है।

नोडजेएस (v6.6.0) में, कंसोल मॉड्यूल के भीतर कंसोल नामक एक वर्ग मौजूद है जो उपयोगकर्ता स्पष्ट रूप से फ़ाइल में पाइप लॉग कर सकता है (या जो उपयोगकर्ता को स्ट्रीम करता है)। Node.js v6.6.0 एपीआई विनिर्देश के अनुसार,

console = new Console(process.stdout, process.stderr); 

Console ब्राउज़र में मौजूद नहीं है के रूप में यह आवश्यक नहीं है। कंसोल का उत्पादन केवल डीबगिंग के लिए उपयोग किए गए कैनवास में मौजूद है, और इसके बिल्कुल एक उदाहरण हैं। उपयोगकर्ता किसी भी अन्य स्थानों पर कंसोल के पाइप आउटपुट को सक्षम नहीं कर सकता है, और यह एक गंभीर सुरक्षा समस्या बन जाएगा। इस वजह से, डेवलपर्स लॉग फ़ंक्शन के भीतर कुछ कर सकते हैं जैसे var x = this.x || console.x क्योंकि कंसोल ऑब्जेक्ट का बिल्कुल एक उदाहरण है।

+0

'कंसोल' फ़ायरफ़ॉक्स में मौजूद है। साथ ही, उपयोगकर्ता 'console.log()' फ़ंक्शन को ओवरराइट करके, कंसोल के पाइप आउटपुट को पाइप कर सकता है (इस प्रकार स्टैक स्निपेट में वर्चुअल कंसोल काम करता है)। –

+0

कंसोल को बदलना।एक और समारोह के साथ लॉग इन पाइपिंग नहीं है। यदि आप किसी फ़ाइल में पाइप कंसोल आउटपुट पा सकते हैं, तो आप इसके साथ क्लाइंट पीसी पर निष्पादन योग्य फ़ाइल बना सकते हैं। नोडजेएस में, आप रन टाइम पर कंसोल ऑब्जेक्ट को फिर से बना सकते हैं यदि आप सभी संदेशों को फ़ाइल या एकाधिक फाइलों पर रीडायरेक्ट करना चाहते हैं। –

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