58 votes

Passer les arguments à console.log comme des arguments de première classe via la fonction proxy

console.log prend un nombre non spécifié d'arguments et vide leur contenu sur une seule ligne.

Existe-t-il un moyen d'écrire une fonction qui transmet les arguments qui lui sont passés directement à la fonction console.log pour maintenir ce comportement ? Par exemple :

function log(){
    if(console){
        /* code here */
    }
}

Ce ne serait pas la même chose que :

function log(){
    if(console){
        console.log(arguments);
    }
}

Depuis arguments est un tableau et console.log va vider le contenu de ce tableau. Ce ne sera pas non plus la même chose que :

function log(){
    if(console){
        for(i=0;i<arguments.length;console.log(arguments[i]),i++);
    }
}

Puisque cela imprimera tout dans des lignes différentes. Le but est de maintenir console.log mais par le biais d'une fonction proxy log .

+---

Je cherchais une solution que je pourrais appliquer à toutes les fonctions à l'avenir (créer un proxy pour une fonction en conservant la gestion des arguments intacte). Si cela n'est pas possible, j'accepterai une solution de remplacement. console.log réponse spécifique.

88voto

Gaby aka G. Petrioli Points 85891

Cela devrait faire l'affaire.

function log() {
    if(typeof(console) !== 'undefined') {
        console.log.apply(console, arguments);
    }
}

J'ajoute simplement une autre option ( _en utilisant le spread et l'opérateur reste paramètres - bien que arguments pourrait être utilisé directement avec la diffusion_ )

function log(...args) {
    if(typeof(console) !== 'undefined') {
        console.log(...args);
    }
}

8voto

nheinrich Points 1388

Il existe un bon exemple de code html5boilerplate qui enveloppe console.log d'une manière similaire pour s'assurer que vous ne perturbez pas les navigateurs qui ne le reconnaissent pas. Il ajoute également un historique et atténue toute différence dans l'implémentation de console.log.

Il a été développé par Paul Irish et il a rédigé un article à ce sujet. aquí .

J'ai collé le code pertinent ci-dessous, voici un lien vers le fichier dans le projet : https://github.com/h5bp/html5-boilerplate/blob/master/js/plugins.js

// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function(){
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  if(this.console) {
    arguments.callee = arguments.callee.caller;
    var newarr = [].slice.call(arguments);
    (typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr));
  }
};

// make it safe to use console.log always
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}}((function(){try {console.log();return window.console;}catch(err){return window.console={};}})());

3voto

Niet the Dark Absol Points 154811

Oui.

console.log.apply(null,arguments);

Il se peut que vous deviez boucler l'objet arguments et créer un tableau régulier à partir de celui-ci, mais à part cela, c'est comme ça qu'il faut faire.

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