variable objetos log ejemplo chrome javascript internet-explorer console logging wrapper

javascript - objetos - console.log variable



¿Cómo ajustar de forma segura `console.log`? (11)

¿Se puede llamar normalmente a esta función de registro en IE, y el uso de aplicar aquí es solo para mostrar que es posible?

Si y si. Ese ejemplo particular estaba dirigido directamente a la parte "¿es una función real?" De la pregunta vinculada.

Y, supongo por la pregunta vinculada que esto fallará si la consola de IE se cierra cuando se ejecuta, por lo que el registro no funcionará incluso después de que se abra la consola, ¿correcto?

Correcto. Como se explicó en mi respuesta a esa pregunta, el objeto de la console no se expone hasta la primera vez que se abren las herramientas del desarrollador para una pestaña en particular. La mayoría de los desarrolladores usan un calce de consola, en cuyo caso el enfoque de Function#bind vuelve un poco obsoleto porque también puede usar el método de Function#apply.apply .

¿Cuál es el propósito de convertir argumentos a una matriz en este caso?

No hay uno, es redundante. A menos que se trate de una implementación de registro personalizada, en cuyo caso el desarrollador puede tener una razón para convertir un objeto de argumentos en una matriz.

Y el prototipo cumple un propósito en los ejemplos anteriores, o solo estamos siendo pedantes ...

Bueno, sí y no. Algún desarrollador puede haber cambiado involuntariamente Function.call a una función o valor personalizado. Por supuesto, también podrían romper Function.prototype.call , pero es mucho menos probable que esto ocurra por accidente.

Supongamos que quiero incluir algunas llamadas a console.log por algún motivo legítimo de producción, por ejemplo, algo así como un arnés de prueba de unidad. Obviamente, no me gustaría que arroje una excepción prematura si el navegador no tiene una console , o si no hay una consola presente .

¿Cuál es la mejor manera de crear una función de log simple para registrar cosas en la consola, o silenciosamente fallar sin error si no hay una consola presente?

La respuesta aceptada a la pregunta vinculada anteriormente:

var log = Function.prototype.bind.call(console.log, console); log.apply(console, ["this", "is", "a", "test"]);

¿Se puede llamar normalmente a esta función de log en IE, y el uso de apply aquí es solo para mostrar que es posible? Y, supongo por la pregunta vinculada que esto fallará si la consola de IE se cierra cuando se ejecuta, por lo que el log no funcionará incluso después de que se abra la consola, ¿correcto? Si eso está mal, ¿alguien puede explicar cómo funciona?

Este artículo de ycombinator parece relevante. ¿Están hablando del mismo comportamiento de IE que la pregunta vinculada anteriormente?

Function.prototype.apply.apply(console.log, [console, arguments]);

Funciona tanto en IE9 broken console.log como en console.log regular de otros proveedores. Mismo truco que usar Array.prototype.slice para convertir argumentos en una matriz real.

Esto funciona muy bien en mi consola de Chrome.

function echo(){ Function.prototype.apply.apply(console.log, [console, arguments]); }

Simplificado:

function echo(){ Function.apply.call(console.log, console, arguments); }

Agregue un cheque y devuelva:

function echo(){ return window.console && console.log && Function.apply.call(console.log, console, arguments); }

El ejemplo anterior me parece adecuado. Sin embargo, no tengo IE disponible para probarlo. ¿Es este un enfoque razonable para envolver de forma segura console.log ?

Más preguntas

Siguiendo el enlace en la respuesta de navegación a continuación, vemos el código:

Function.prototype.call.call(console.log, console, Array.prototype.slice.call(arguments));

¿Cuál es el propósito de convertir arguments a una matriz en este caso? Supongo que debe fallar en algún navegador si no haces esto? Y, aparte del comportamiento extraño de la opera y los navegadores sin consola, ¿no debería funcionar algo así para todos los demás navegadores? Y el prototype cumple una función en los ejemplos anteriores, o simplemente estamos siendo pedantes ... Function.call.call o Object.call.call o, para el caso, es isNaN.call.call que isNaN.call.call funcione tan bien como Function.prototype.call.call .


Use consolación

Mi consola ridículamente rediseñada:

  • evita errores si no hay consola
  • evita el inicio de sesión en producción si dejó instrucciones console.log en su código
  • admite console.error , console.group y todos los demás métodos
  • aún le da retrocesos a sus declaraciones de registro

Es asombroso.

Pero realmente, no debes dejar declaraciones de console en tu código.

¡Mira y tiembla! Presentando: Consolation.js


Como una ligera variación en la respuesta de Chris, simplemente defina ''log'' como una propiedad de ''console'' con una función vacía:

if (typeof console === "undefined") { console = { log: function () { return; } }; }


El problema con los contenedores es que ofuscarán el nombre del archivo y el número de línea del origen del mensaje de registro.

IE7 simple e inferior shim que preserva la numeración de líneas para otros navegadores:

/* console shim*/ (function () { var f = function () {}; if (!window.console) { window.console = { log:f, info:f, warn:f, debug:f, error:f }; } }());


Intenta usar el fragmento de código siguiente ... (este es mi enfoque preferido porque te hace independiente de window.console)

var logger = (function (c) { "use strict"; var m = { log: function (a, t) { if (!c) { return; /* return or call your custom function here */ } var l = c.log, f = t === undefined ? l : (this.__dict__[t] || l); f.apply(c, a) }, __dict__: { "trace": c.trace, "debug": c.debug, "info": c.info, "warn": c.warn, "error": c.error } }; return { trace: function () { m.log(arguments, "trace"); }, debug: function () { m.log(arguments, "debug"); }, info: function () { m.log(arguments, "info"); }, warn: function () { m.log(arguments, "warn"); }, error: function () { m.log(arguments, "error"); }, log: function () { m.log(arguments, undefined); } }; }(window.console))

Así que ahora puede probar esto en su código y ver el resultado

logger.info("Hello"); logger.trace("Hello"); logger.debug("Hello"); logger.warn("Hello"); logger.error("Hello"); logger.log("Hello");


Lo siento, hubo un error en mi publicación. No sé cómo me lo perdí.

La forma CORRECTA de crear un objeto de consola global, si no existe:

if (typeof console === "undefined"){ console={}; console.log = function(){ return; } }


Me gusta usar:

''console'' in window && console.log("Boom!");

Funciona en todos los navegadores y es fácil de entender.


Mi solución es un poco diferente. Creo un acceso directo estándar para todas las llamadas de console.log: en mi caso, kag (lo que quiera informar en la consola).

Pruebo para IE, si IE envío los resultados a un cuadro de alerta. Si Chrome aparece en la consola. Esto también significa que IE siempre funcionará incluso si la consola está cerrada:

Código:

var iever = getInternetExplorerVersion(); if(iever>-1){ function kag(params){ alert(params); } } else { var kag = console.log.bind(console, "REPORT: "); } function getInternetExplorerVersion() { var rv = -1; if (navigator.appName == ''Microsoft Internet Explorer'') { var ua = navigator.userAgent; var re = new RegExp("MSIE ([0-9]{1,}[/.0-9]{0,})"); if (re.exec(ua) != null){ rv = parseFloat( RegExp.$1 ); } } return rv; }


Paul Irish tiene una agradable envoltura / reemplazo de luz para console.log() .

http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/

Ventajas:

  • Prevenir errores si una consola no está cerca (es decir, IE)
  • Mantiene un historial de registros, por lo que puede ver en el pasado si su consola se agrega después (por ejemplo, firebug lite)
  • Ligero y simple.
  • Muy rápido para escribir - log() o window.log() .

coffeescript:

empty_function = -> return if !window.console? window.console = {} for fn in [''log'', ''info'', ''warn'', ''debug'', ''error''] if (typeof window.console[fn] isnt ''function'') window.console[fn] = empty_function

js:

(function() { var empty_function, fn, i, len, ref; empty_function = function() {}; if (window.console == null) { window.console = {}; ref = [''log'', ''info'', ''warn'', ''debug'', ''error'']; for (i = 0, len = ref.length; i < len; i++) { fn = ref[i]; if (typeof window.console[fn] !== ''function'') { window.console[fn] = empty_function; } } } }).call(this);