2012-07-20 33 views
7

Tôi đã xem xét một số các console.log() wrappers/polyfills phổ biến:Tại sao console.log() polyfills không sử dụng Function.apply()?

Tôi nhận thấy rằng tất cả trong số họ chấp nhận nhiều arguments, nhưng họ tất cả làm một việc như sau:

console.log(arguments); 

nào dẫn đến đầu ra như thế này (trong Chrome):

<code>console.log(['foo', 'bar', $('body')])</code>

Trong khi đó, ít nhất là trong một trình duyệt hiện đại như Chrome hoặc Firefox, console.log() cũng chấp nhận nhiều đối số, do đó điều này sẽ tạo ra (IMHO) sản lượng vượt trội:

console.log.apply(console, arguments) 

nào dẫn đến đầu ra như thế này (trong Chrome):

<code>console.log.apply(console, ['foo', 'bar', $('body')])</code>

Có lý do cụ thể nào khiến tôi nên tránh sử dụng console.log.apply() với nhiều đối số không? Hoặc điều này chỉ là vấn đề của hương vị hoặc tiết kiệm byte?

+0

@PaulIrish Bất kỳ suy nghĩ nào về console.log và console.log.apply? –

+3

Đây có lẽ không phải là lý do chính, nhưng thuộc tính console.log trong IE không có nguyên mẫu Hàm. Tức là, nó không có hàm 'apply'. – Sam

+1

Vâng, đó có lẽ là một lý do rất tốt. –

Trả lời

1

Cá nhân tôi khuyên bạn chỉ nên sử dụng .apply() khi bạn phải: .apply() là cách duy nhất để chuyển mảng thành đối số của hàm. Nếu bạn không cần để chuyển mảng, thì chỉ cần sử dụng console.log(). Nó ít chi tiết hơn và nó là một lời cầu khẩn trực tiếp.

+0

Vâng, đó là những gì * tôi nghĩ, nhưng những người biết JS tốt hơn tôi không làm điều này, và vì vậy tôi muốn biết tại sao. –

0

Xin lưu ý rằng apply mất một số mảng đối số!

Vì vậy, hãy gọi console.log(args) phải là console.log.apply(console, [args]), không console.log.apply(console, args) để hoạt động bình đẳng - trong ví dụ của bạn mỗi mục trong mảng trở thành đối số rất riêng của mình khi áp dụng.

Mặt khác, bạn cũng có thể gọi console.log("foo", "bar", $("body"))

Các vấn đề liên quan