22

Stavo usando console.log() in qualche JavaScript che ho scritto e un errore di: console is not defined è stato lanciato in Internet Explorer (funzionava bene in altri browser).Internet Explorer: "console non è definita" Errore

ho sostituito con:

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

Se console è undefined, mi aspetterei la condizione di valutare come false. Ergo, la dichiarazione console.log non verrebbe eseguita e non dovrebbe generare un errore.

Viene invece generato un errore di: console is not defined at character 4.

Si tratta di un bug di IE? Oppure la condizione "se" è veramente illegale? Sembra assurdo, perché se if (console) è illegale, allora anche if (console==undefined) dovrebbe essere illegale.

Come è possibile verificare le variabili undefined?

+13

'console' non esiste in IE a meno che la console sia effettivamente aperta. –

+0

BTW potresti avere qualche altro oggetto 'console', quindi la soluzione infallibile sarebbe controllare che' console.log' esista ed sia una funzione. – kirilloid

+2

possibile duplicato di ['console' è un errore indefinito per internet explorer] (http://stackoverflow.com/questions/3326650/console-is-undefined-error-for-internet-explorer) –

risposta

25

Se consolestesso non esiste affatto, genera un errore, perché si sta accedendo una variabile non definita. Proprio come if(abc) {} genera un errore.

Dal console risiede in window, e windowfa esiste sempre, questo dovrebbe funzionare:

if(window.console) ... 

In sostanza, accede a un proprietà che non esiste è gratuito e non genera un errore (viene semplicemente valutato a undefined, in mancanza della condizione if). Tuttavia, è illegale accedere a una variabile non dichiarata.

+1

'if ('console' nella finestra)' funzionerà pure – kirilloid

+0

Preferisco 'if ('console' nella finestra)', ma entrambi funzionano – tkone

+2

Puoi anche fare: if (typeof console === 'undefined') – levi

3

Che ne dici di questo? Non ho provato, però

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

Questo è il male. ;) – sjas

7

in Internet Explorer l'oggetto console non è in realtà definita a meno che i vostri strumenti di sviluppo sono aperti al momento i carichi delle finestre.

di risolvere il problema, avvolgere tutte le stampe della console in un'istruzione if:

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

è inoltre necessario aggiornare ogni pagina dopo aver aperto gli strumenti di sviluppo, al fine di vedere i stampe console. < 3 IE

+0

"Al momento la finestra si carica" ​​.. !! +1 per quello –

4

Questa è una cosa divertente delle variabili non dichiarate. Il motore JS tenta di risolvere la variabile in una proprietà di window. Quindi di solito, foo == window.foo.

Tuttavia, se questa proprietà non esiste, genera un errore.

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

(dovrebbe essere "foo non è dichiarato" imho, ma qualunque cosa.) Questo errore non si verifica quando si esplicitamente riferimento di proprietà della finestra:

alert(window.foo); // undefined 

... o dichiarare tale variabile:

var foo; 
alert(foo); // undefined 

... o utilizzarlo per l'inizializzazione:

foo = 1; // window.foo = 1 

La cosa strana è che l'operatore typeof impedisce anche questo errore:

alert(typeof foo); // "undefined" 

Quindi, per riassumere le cose: non è possibile utilizzare le variabili non dichiarate nelle espressioni a meno che non ci sia una proprietà di window con lo stesso nome, oppure utilizzarlo come operando di typeof. Nel tuo esempio, window.console non esiste e non esiste alcuna dichiarazione var. Ecco perché ricevi un errore.

30

Altre risposte hanno fornito la causa principale. Tuttavia, c'è una soluzione migliore rispetto all'utilizzo di if prima di ogni chiamata a console.*

Aggiungere questo (una volta) prima di includere qualsiasi dei vostri script che utilizzano console:

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

questo creerà solo una console 'pseudo' se non esiste, in modo che 'console non è definita' gli errori andranno via e non dovrai chiedere se la console esiste ogni volta. Con questo, chiami semplicemente console.log o qualsiasi metodo di console ovunque, senza problemi.

Spero che questo aiuti. Cheers

+1

Ho fatto una modifica sopra - usa un parametro (ho scelto il nome 'logMsg' arbitrariamente) nella firma della funzione per essere coerente dato che passerai qualcosa da stampare sul log. Questo evita anche qualsiasi errore intellisense in un ID abilitato JS –

+0

@Edgar Risposta eccellente grazie mille ..... +1 per la risposta –

+0

Contento che ti abbia aiutato :) –

0

È possibile utilizzare il sotto per dare un ulteriore grado di assicurazione che hai coperto tutte le basi. Utilizzando typeof per prima cosa si eviteranno errori undefined. L'utilizzo di === assicurerà inoltre che il nome del tipo sia effettivamente la stringa "non definita". Infine, ti consigliamo di aggiungere un parametro alla firma della funzione (ho scelto arbitrariamente lo logMsg) per assicurarne la coerenza, dal momento che si passa a qualsiasi cosa si desideri stampare sulla console per la funzione di registro. Ciò ti assicura anche precisione intellettuale ed evita qualsiasi avviso/errore nel tuo IDE JS.

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

Ispirato @Edgar Villegas Alvaradoanswer, ha completato i metodi e ne ha fatto un po 'più semplice:

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

A cura di mettere in un IIFE e fissare un errore di sintassi!

1

Modifica del @yckart's answer

Uso c.length come input ad una funzione che definisce c non funzionerà. Inoltre stai solo riassegnando gli elementi nell'array con noop quando dovresti aggiungere metodi a 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); 
Problemi correlati