2014-04-24 15 views
9

Tôi có hàm, message cần một tham số để xác định loại thư và sau đó nó tham gia bất kỳ đối số nào khác để tạo thông điệp, hoàn toàn là độc đáo.Đối số chuẩn bị cho đối số sau đó áp dụng

Nó trông như thế này:

function message(type) { 
    var msg = _.rest(arguments).join(" "); 

    // Really the type will be used to set the class on a div 
    // But I'm just using console.log to keep it simple for now. 
    console.log(type + ": " + msg); 
} 

Tôi muốn cung cấp chức năng helper, error, warning, info, mà chỉ đơn giản gọi message với đúng loại. Tôi chỉ không chắc chắn về cách tốt nhất để đi về điều này. Tôi không thể nghĩ ra hai cách nhưng tôi không chắc chắn liệu tôi có nói về nó một cách chính xác hay không hoặc có lẽ tôi đang làm quá nhiều thứ.

Cách đầu tiên có vẻ hơi dư thừa, tạo một mảng mới chứa arg đầu tiên và đối số rồi làm phẳng nó.

message.apply(this, _.flatten(["error", arguments])); 

Cách thứ hai cảm thấy hơi ... lộn xộn?

Array.prototype.unshift.call(arguments, "error"); 
message.apply(this, arguments); 

Mặc dù từ Thí nghiệm của tôi:

(function() { 
    Array.prototype.unshift.call(arguments, 0); 
    console,log(arguments); 
})(1, 2, 3); 

tôi nhận được kết quả như sau:

[0, 1, 2, 3, undefined, undefined, undefined, ..., undefined] 

Trả lời

5

Trong ES5 này có thể là một chút hiệu quả hơn converti ng đến một mảng thực đầu tiên và sau đó unshift:

var args = Array.prototype.concat.apply(["error"], arguments); 
message.apply(this, args); 

EDIT: Tốt hơn để tránh làm phẳng mảng đầu vào:

var args = ["error"]; 
args.push.apply(args, arguments); 
message.apply(this, args); 
+1

Hãy cẩn thận khi sử dụng điều này, như thể các phần tử của 'đối số' là mảng chúng sẽ được 'làm phẳng' thành mảng thay vì được thêm vào như một phần tử. ví dụ. 'var args = Array.prototype.concat.apply ([" error "], [" apple "," banana ", [" carrot "," cherry "]])' không chính xác trở thành 'args = [" error ", "táo", "chuối", "cà rốt", "anh đào"] '. – samthecodingman

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