22

मैं कुछ जावास्क्रिप्ट में console.log() का उपयोग कर रहा था और console is not defined को इंटरनेट एक्सप्लोरर में फेंक दिया गया था (अन्य ब्राउज़रों में ठीक काम किया गया था)।इंटरनेट एक्सप्लोरर: "कंसोल परिभाषित नहीं किया गया है" त्रुटि

मैं के साथ यह जगह ले ली है:

if (console) console.log("...");

तो consoleundefined है, मैं शर्त false के रूप में मूल्यांकन करने के लिए उम्मीद करेंगे। Ergo, बयान console.log निष्पादित नहीं किया जाएगा और एक त्रुटि फेंकना नहीं चाहिए।

इसके बजाय, console is not defined at character 4 की एक त्रुटि फेंक दी गई है।

क्या यह एक आईई बग है? या यह है कि "अगर" स्थिति वास्तव में अवैध है? यह बेतुका लगता है क्योंकि अगर if (console) अवैध है, तो if (console==undefined) भी अवैध होना चाहिए।

आपको undefined चर के लिए कैसे जांचना चाहिए?

+13

'कंसोल' IE में मौजूद नहीं है जब तक कि कंसोल वास्तव में खुला न हो। –

+0

बीटीडब्ल्यू आपके पास कुछ और 'कंसोल' ऑब्जेक्ट हो सकता है, इसलिए मूर्खतापूर्ण समाधान यह जांचना होगा कि 'console.log' मौजूद है और यह एक फ़ंक्शन है। – kirilloid

+2

['कंसोल' का संभावित डुप्लिकेट इंटरनेट एक्सप्लोरर के लिए अपरिभाषित त्रुटि है] (http://stackoverflow.com/questions/3326650/console-is-undefined-error-for-internet-explorer) –

उत्तर

25

यदि consoleस्वयं बिल्कुल मौजूद नहीं है, तो यह एक त्रुटि फेंकता है क्योंकि आप एक अपरिभाषित चर का उपयोग कर रहे हैं। if(abc) {} की तरह ही एक त्रुटि फेंकता है।

console के बाद से window में रहता है, और window हमेशा मौजूद हैं, इस काम करना चाहिए करता है:

if(window.console) ... 

मूल रूप से, तक पहुंचने में कोई संपत्ति जो मौजूद नहीं है नि: शुल्क है और एक त्रुटि फेंक नहीं है (यह undefined का मूल्यांकन करता है, if स्थिति में विफल)। हालांकि, एक अविकसित परिवर्तनीय तक पहुंचना गैरकानूनी है।

+1

'अगर (विंडो में 'कंसोल') काम करेगा – kirilloid

+0

मैं' if ('विंडो में' कंसोल '' पसंद करता हूं, लेकिन दोनों काम – tkone

+2

आप यह भी कर सकते हैं: अगर (टाइपो कंसोल === 'अपरिभाषित') – levi

3

इस बारे में कैसे? इसे करने की कोशिश नहीं है, हालांकि

if (typeof console == "undefined" || typeof console.log == "undefined") var console = { log: function() {} }; 
+0

यह बुरा है। ;) – sjas

7
इंटरनेट एक्सप्लोरर में

सांत्वना वस्तु वास्तव में परिभाषित नहीं है जब तक कि आपका डेवलपर उपकरण समय विंडो लोड से खुली हुई हैं है।

आपकी समस्या को ठीक करने के लिए, एक अगर बयान में अपने सभी सांत्वना प्रिंट लपेट:

if (typeof window.console !== 'undefined') { 
    ... 
} 

आप भी आप कंसोल प्रिंट देखने के लिए डेवलपर टूल खोलने के बाद प्रत्येक पृष्ठ को ताज़ा करने की जरूरत है। < 3 आईई

+0

"उस समय खिड़की भार" .. !! उस –

4

यह अविकसित चर के बारे में एक मजेदार बात है। जेएस इंजन वैरिएबल को window की संपत्ति में हल करने का प्रयास करता है। तो आमतौर पर, foo == window.foo

लेकिन, यदि वह संपत्ति मौजूद नहीं है, तो यह एक त्रुटि फेंकता है।

alert(foo); // Syntax error: foo is not defined 

(होना चाहिए imho, लेकिन जो कुछ भी "foo घोषित नहीं है।") यह त्रुटि नहीं होती है जब आप स्पष्ट संदर्भ खिड़की की संपत्ति:

alert(window.foo); // undefined 

... या कि चर घोषित:

var foo; 
alert(foo); // undefined 

... या आरंभीकरण के लिए इसका इस्तेमाल करते हैं:

foo = 1; // window.foo = 1 

अजीब बात यह है कि typeof ऑपरेटर भी इस त्रुटि को रोकता है:

alert(typeof foo); // "undefined" 

तो, चीजों को योग करने के लिए: जब तक ही नाम के साथ window की संपत्ति नहीं है आप भाव में अघोषित चर का उपयोग नहीं कर सकते हैं, या आप typeof के संकार्य के रूप में उपयोग। आपके उदाहरण में, window.console मौजूद नहीं है, और कोई विविध घोषणा नहीं है। यही कारण है कि आपको एक त्रुटि मिलती है।

30

अन्य उत्तरों ने आपको मूल कारण दिया है।

//Ensures there will be no 'console is undefined' errors 
window.console = window.console || (function(){ 
    var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(s){}; 
    return c; 
})(); 

यह केवल एक 'छद्म' सांत्वना पैदा करेगा: हालांकि, वहाँ अपनी स्क्रिप्ट कि कंसोल का उपयोग के किसी भी शामिल करने से पहले console.* के लिए किसी भी कॉल करने से पहले if का उपयोग करने से एक बेहतर समाधान

इस (एक बार) जोड़े है यदि यह अस्तित्व में नहीं है, तो 'कंसोल अपरिभाषित है' त्रुटियां दूर हो जाएंगी और आपको यह पूछना नहीं होगा कि कंसोल हर समय मौजूद है या नहीं। इसके साथ, आप समस्याओं के बिना कहीं भी console.log या किसी कंसोल विधि को कॉल करें।

उम्मीद है कि इससे मदद मिलती है। चीयर्स

+1

के लिए +1 मैंने ऊपर एक संपादन किया - एक पैरामीटर का उपयोग करें (मैंने नाम हस्ताक्षर में 'logMsg' नाम को चुना है) क्योंकि आप लॉग पर मुद्रित होने के लिए कुछ पास करेंगे। यह किसी जेएस सक्षम आईडीई –

+0

@Edgar में किसी भी इंटेलिजेंस त्रुटियों से बचाता है। उत्कृष्ट उत्तर आपको बहुत धन्यवाद ..... उत्तर के लिए +1 –

+0

खुशी है कि यह आपकी मदद करता है :) –

0

आप नीचे दिए गए बीमा का एक अतिरिक्त डिग्री देने के लिए नीचे दिए गए उपयोग कर सकते हैं कि आपके पास सभी आधार शामिल हैं। typeof का उपयोग पहले किसी भी undefined त्रुटियों से बच जाएगा। === का उपयोग करके यह भी सुनिश्चित होगा कि प्रकार का नाम वास्तव में स्ट्रिंग "अपरिभाषित" है। अंत में, आप स्थिरता सुनिश्चित करने के लिए फ़ंक्शन हस्ताक्षर में एक पैरामीटर जोड़ना चाहते हैं (मैंने logMsg मनमाने ढंग से चुना है), क्योंकि आप लॉग फ़ंक्शन में कंसोल पर जो भी प्रिंट करना चाहते हैं उसे पास करते हैं। यह आपको इंटेलिजेंस सटीक भी रखता है और आपके जेएस जागरूक आईडीई में किसी भी चेतावनी/त्रुटियों से बचाता है।

if(!window.console || typeof console === "undefined") { 
    var console = { log: function (logMsg) { } }; 
} 
0

@Edgar Villegas Alvaradoanswer से प्रेरित होकर, तरीकों से पूरा किया और यह थोड़ा आसान बना:

(function(w){ 
    var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','), 
    noop = function() {}; 

    w.console = w.console || (function (len) { 
    var ret = {}; 
    while (len--) { ret[c[len]] = noop; } 
    return ret; 
    }(c.length)); 
})(window); 

संपादित एक Iife में डाल दिया और एक सिंटैक्स त्रुटि ठीक करने के लिए!

1

@yckart's answer

संपादन एक समारोह जो ग काम नहीं करेगा को परिभाषित करता है करने के लिए इनपुट के रूप में c.length का उपयोग करना। जब आप window.console में विधियों को जोड़ना चाहते हैं तो आप सरणी में आइटम को फिर से असाइन कर रहे हैं।

(function(w){ 
    var c = 'assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,table,time,timeEnd,timeStamp,trace,warn'.split(','), 
    noop = function() {}; 

    w.console = w.console || (function (len) { 
    var ret = {}; 
    while (len--) { ret[c[len]] = noop; } 
    return ret; 
    }(c.length)); 
})(window); 
संबंधित मुद्दे