22

Estaba usando console.log() en algunos JavaScript que escribí y un error de: console is not defined se lanzó en Internet Explorer (funcionó bien en otros navegadores).Internet Explorer: "consola no está definida" Error

he reemplazado con:

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

Si console es undefined, esperaría que la condición a evaluar como false. Ergo, la instrucción console.log no se ejecutará y no debería arrojar un error.

En su lugar, se produce un error de: console is not defined at character 4.

¿Es esto un error de IE? ¿O es esa condición "si" realmente ilegal? Parece absurdo porque si if (console) es ilegal, entonces if (console==undefined) también debería ser ilegal.

¿Cómo se supone que debe verificar las variables undefined?

+13

'console' no existe en IE a menos que la consola esté realmente abierta. –

+0

Por cierto, puede tener algún otro objeto 'console', por lo tanto, una solución infalible sería comprobar que' console.log' existe y es una función. – kirilloid

+2

posible duplicado de ['console' es un error indefinido para Internet Explorer] (http://stackoverflow.com/questions/3326650/console-is-undefined-error-for-internet-explorer) –

Respuesta

25

Si consoleen sí no existe, se produce un error porque se está accediendo a una variable indefinida. Al igual que if(abc) {} arroja un error.

Desde console reside en window, y window hace siempre existen, esto debería funcionar:

if(window.console) ... 

Básicamente, el acceso a una propiedad que no existe es gratuito y no generará un error (solo evalúa a undefined, fallando la condición if). Sin embargo, es ilegal acceder a una variable no declarada .

+1

'if ('console' en la ventana)' funcionará también – kirilloid

+0

Prefiero 'if ('console' en la ventana)', pero ambos funcionan – tkone

+2

También puede hacer: if (typeof console === 'undefined') – levi

3

¿Qué tal esto? No lo ha intentado aunque

+0

Esto es malo. ;) – sjas

7

en Internet Explorer el objeto de la consola no está realmente definido a menos que sus herramientas de desarrollador estén abiertas en el momento en que se carga la ventana.

para arreglar su problema, ajuste todas las impresiones de la consola en una sentencia if:

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

también es necesario actualizar cada página después de abrir las herramientas de desarrollo con el fin de ver los grabados de la consola. < 3 IE

+0

"En el momento en que se carga la ventana" ... !! +1 para esa –

4

Esto es algo gracioso sobre las variables no declaradas. El motor JS intenta resolver la variable a una propiedad de window. Por lo general, foo == window.foo.

Pero, si esa propiedad no existe, arroja un error.

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

(debe ser "foo no es declararon" en mi humilde opinión, pero lo que sea.) No se produce este error cuando explícitamente referencia de la propiedad de la ventana:

alert(window.foo); // undefined 

... o declarar esa variable:

var foo; 
alert(foo); // undefined 

... o utilizarlo para la inicialización:

foo = 1; // window.foo = 1 

Lo extraño es que el operador typeof también evita este error:

alert(typeof foo); // "undefined" 

lo tanto, para resumir las cosas: No se puede utilizar variables no declaradas en las expresiones a menos que haya una propiedad de window con el mismo nombre, o utilizarlo como un operando de typeof. En su ejemplo, window.console no existe, y no hay ninguna declaración var. Es por eso que obtienes un error.

30

Otras respuestas dieron la causa raíz. Sin embargo, hay una solución mejor que usar if antes de cualquier llamada a console.*

Añadir esta (una vez) antes de incluir cualquiera de las secuencias de comandos que utilizan la consola:

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

Esto creará una consola pseudoespecífico solamente si no existe, de modo que la "consola no está definida" los errores desaparecerán y no tendrá que preguntar si la consola existe cada vez. Con esto, simplemente llame al console.log o cualquier método de consola en cualquier lugar, sin problemas.

Espero que esto ayude. Cheers

+1

He hecho una edición anterior: use un parámetro (elegí el nombre 'logMsg' arbitrariamente) en la firma de la función para que sea coherente, ya que estará pasando algo para imprimir en el registro. Esto también evita cualquier error intellisense en un IDE habilitado para JS –

+0

@Edgar Respuesta excelente muchas gracias ..... +1 por la respuesta –

+0

Me alegro de que lo haya ayudado :) –

0

Puede utilizar el siguiente formulario para obtener un grado adicional de seguro que cubra todas sus necesidades. El uso de typeof primero evitará cualquier error undefined. Usar === también asegurará que el nombre del tipo sea realmente la cadena "indefinida". Finalmente, querrá agregar un parámetro a la firma de la función (elegí logMsg de forma arbitraria) para garantizar la coherencia, ya que transfiere lo que desea imprimir a la consola a la función de registro. Esto también lo mantendrá inteligente y evitará advertencias/errores en su IDE con JS.

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

Inspirado por @Edgar Villegas Alvaradoanswer, completaron los métodos y lo hizo un poco más simple:

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

Editado poner en un IIFE y corregir un error de sintaxis!

1

Editar de @yckart's answer

Usando c.length como entrada a una función que define c no funcionará. También está reasignando elementos en la matriz con noop cuando debería agregar métodos 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); 
Cuestiones relacionadas