48 votes

Comment emballer en toute sécurité `console.log`?

Supposons que je veux inclure certains appels d' console.log pour certains la production légitime raison, dire quelque chose comme une unité harnais de test. Évidemment, je ne voudrais pas que cela jeter un prématuré exception, si le navigateur ne prend pas en avoir un console, ou si aucune console n'est présent.

Quelle est la meilleure façon de créer une simple log fonction pour faire des logs de la console, ou en silence échoue sans erreur si aucune console n'est présent?

La accepté de répondre à la question ci-dessus:

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

Cela peut - log fonction sera appelée normalement sur IE, et l'utilisation de l' apply ici c'est juste pour montrer que c'est possible? Et, je suppose que de la liés question que ce sera un échec si IE console est fermée lorsqu'il s'exécute, alors log ne fonctionne pas même après que la console s'ouvre, correct? Si c'est faux, quelqu'un peut m'expliquer comment ça fonctionne?

Cette ycombinator article semble pertinent. Sont-ils parlent de la même IE comportement à la question ci-dessus?

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

Fonctionne à la fois sur IE9 cassé la console.le journal et régulier de la console.journal à partir d'autres fournisseurs. Même hack comme à l'aide du Tableau.le prototype.tranche de convertir des arguments dans un vrai tableau.

Cela fonctionne très bien dans ma console chromée.

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

Simplifié:

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

Ajouter une case et de retour:

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

L'exemple ci-dessus semble suffisant pour moi. Je n'ai pas IE sous la main pour tester, si. Est-ce une approche raisonnable pour transporter en toute sécurité habillage console.log?


Plus de questions

En suivant le lien de la valeur liquidative de la réponse ci-dessous, nous voyons le code:

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

Quel est le but de la convertir arguments d'un tableau dans ce cas? Je suppose qu'il doit échouer dans certains navigateur, si vous ne le faites pas? Et, à l'opéra le comportement bizarre et console-moins navigateurs de côté, ne devrait-il pas quelque chose comme ce joli beaucoup de travail pour tout autre navigateur? Et n' prototype servir un but dans les exemples ci-dessus, ou sommes-nous juste d'être pointilleux... Function.call.call ou Object.call.call ou isNaN.call.call semblent fonctionner aussi bien qu' Function.prototype.call.call.

21voto

dbrin Points 10155

Le problème avec les wrappers est qu’ils masqueront le nom de fichier et le numéro de ligne de la source du message de journal.

IE7 simple et inférieur qui préserve la numérotation des lignes pour les autres navigateurs:

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

16voto

ChrisN Points 139

Désolé, il y avait un bug dans mon post. Je ne sais pas comment ça m'a manqué.

La meilleure façon de créer un objet de console global, s’il n’existe pas:

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

7voto

Andy E Points 132925

Cette fonction log être appelé normalement sur IE, et l'utilisation de l'appliquer ici, c'est juste pour montrer que c'est possible?

Oui, et oui. L'exemple particulier a été dirigée carrément à l' "est-il une réelle fonction" partie de la question.

Et, je suppose que de la liés question que ce sera un échec si IE console est fermée lorsqu'il s'exécute, sorte de journal ne fonctionne pas même après que la console s'ouvre, correct?

Correct. Comme expliqué dans ma réponse à cette question, le console objet n'est pas exposée jusqu'au premier temps les outils de développement sont ouverts pour un onglet particulier. La plupart des développeurs utilisent une console de cale, auquel cas l' Function#bind approche devient un peu obsolète car vous pouvez aussi bien utiliser l' Function#apply.apply méthode.

Quel est le but de convertir les arguments d'un tableau dans ce cas?

Il n'existe pas, c'est redondant. Sauf si c'est un custom journal de mise en œuvre, dans ce cas, le développeur peut avoir une raison pour convertir un objet arguments dans un tableau.

Et ne prototype servir un but dans les exemples ci-dessus, ou sommes-nous juste d'être pointilleux...

Eh bien, oui et non. Un développeur peut avoir involontairement changé Function.call pour une fonction personnalisée ou de la valeur. Bien sûr, ils pouvaient briser Function.prototype.call trop, mais c'est beaucoup moins susceptible de se produire par hasard.

6voto

etoxin Points 377

J'aime utiliser:

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

3voto

nav Points 1702

http://patik.com/blog/complete-cross-browser-console-log/ devrait vous être utile, espérons-le.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X