2011-10-29 20 views
50

console.log pobiera nieokreśloną liczbę argumentów i zrzuca ich zawartość w jednym wierszu.Przekazywanie argumentów do pliku console.log jako argumentów pierwszej klasy za pośrednictwem funkcji proxy

Czy istnieje sposób, aby napisać funkcję, która przekazuje argumenty przekazywane bezpośrednio do console.log w celu zachowania tego zachowania? Na przykład:

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

To nie byłoby takie samo jak:

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

Od arguments jest tablicą i console.log zrzuci zawartość tej tablicy. Nie będzie to samo, co:

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

Ponieważ to spowoduje wydrukowanie wszystkiego w różnych wierszach. Chodzi o zachowanie zachowania console.log, ale poprzez funkcję proxy log.

+ ---

Szukałem rozwiązania mógłbym zastosować do wszystkich funkcji w przyszłości (utworzyć proxy dla funkcji prowadzącego obsługę argumentów nienaruszone). Jeśli jednak nie da się tego zrobić, przyjmuję konkretną odpowiedź: console.log.

Odpowiedz

77

To powinno wystarczyć ..

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

Wystarczy dodać inną opcję (pomocą operatora spread i parametry rest - chociaż arguments mogą być wykorzystane bezpośrednio z rozprzestrzenianiem)

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

To nie działa w Chrome/Safari. Zgłasza błąd "Nielegalne wywołanie". – aditya

+3

@aditya, zaktualizowany kod .. nie używałem poprawnego kontekstu .. musisz przekazać 'console' jako argument 'this' do zastosowania .. –

+0

Awesome. To się udało. Dzięki! – aditya

3

Tak.

console.log.apply(null,arguments); 

Chociaż, być może trzeba pętli argumenty obiekt i stworzyć regularną tablicę z nim, ale poza tym to w jaki sposób to zrobić.

+1

To nie działa w Chrome/Safari. Działa w Firebug, ale szuka tutaj rozwiązania opartego na różnych przeglądarkach. – aditya

+0

'args = []; dla (i = 0; i

+0

Nie. Najwyraźniej każde wywołanie "console.log.apply" powoduje zgłoszenie nieprawidłowego błędu wywołania. – aditya

8

Istnieje dobry przykład z kodu html5boplateplate, który otacza console.log w podobny sposób, aby upewnić się, że nie zakłócisz pracy przeglądarek, które go nie rozpoznają. Dodaje również historię i wygładza wszelkie różnice w implementacji console.log.

Został opracowany przez Paula Irish'a i napisał na nim post here.

I wklejeniu odpowiedniego kodu poniżej, tu jest link do pliku w projekcie: 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={};}})()); 
Powiązane problemy