2011-10-29 42 views
50

console.log lấy số lượng đối số không xác định và đổ nội dung của chúng trong một dòng.Truyền đối số cho console.log làm đối số lớp đầu tiên qua chức năng proxy

Có cách nào tôi có thể viết một hàm chuyển đối số được truyền trực tiếp đến console.log để duy trì hành vi đó không? Ví dụ:

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

này sẽ không được giống như:

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

Kể từ arguments là một mảng và console.log sẽ đổ nội dung của mảng đó. Nó cũng sẽ không giống như:

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

Vì điều đó sẽ in mọi thứ theo các dòng khác nhau. Vấn đề là để duy trì hành vi của console.log, nhưng thông qua chức năng proxy log.

+ ---

tôi đang tìm kiếm một giải pháp tôi có thể áp dụng cho tất cả các chức năng trong thời gian tới (tạo một proxy cho một chức năng duy trì việc xử lý các đối số còn nguyên vẹn). Tuy nhiên, nếu điều đó không thể thực hiện được, tôi sẽ chấp nhận một câu trả lời cụ thể là console.log.

Trả lời

77

này nên làm điều đó ..

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

Chỉ cần thêm một tùy chọn (sử dụng spread điều hành và các thông số rest - mặc dù arguments có thể được sử dụng trực tiếp với sự lây lan)

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

Tính năng này không hoạt động trong Chrome/Safari. Nó ném một lỗi "Yêu cầu bất hợp pháp". – aditya

+3

@aditya, mã cập nhật .. tôi đã không sử dụng đúng ngữ cảnh .. bạn cần phải chuyển 'giao diện điều khiển' làm đối số' this' này để áp dụng .. –

+0

Tuyệt vời. Điều đó hiệu quả. Cảm ơn! – aditya

3

Có.

console.log.apply(null,arguments); 

Mặc dù, bạn có thể cần lặp qua đối tượng đối số và tạo một mảng thông thường từ đối tượng đó, ngoài việc bạn làm như vậy.

+1

này không hoạt động trong Chrome/Safari. Nó hoạt động trong Firebug, nhưng tìm kiếm một giải pháp cross-browser ở đây. – aditya

+0

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

+0

Không. Rõ ràng, bất kỳ lệnh gọi nào đến 'console.log.apply' đều ném một lỗi yêu cầu bất hợp pháp. – aditya

8

Có một ví dụ điển hình từ mã html5boilerplate kết thúc tốt đẹp console.log theo cách tương tự để đảm bảo bạn không làm gián đoạn bất kỳ trình duyệt nào không nhận ra nó. Nó cũng thêm một lịch sử và làm mịn bất kỳ sự khác biệt trong việc thực hiện console.log.

Nó được phát triển bởi Paul Irish và ông đã viết một bài đăng trên đó here.

Tôi đã dán mã có liên quan bên dưới, đây là một liên kết đến tập tin trong dự án: 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={};}})()); 
Các vấn đề liên quan