Tôi đang ngày càng phát triển javascript và muốn đảm bảo rằng tôi đang theo các quy ước phổ biến. Hiện tại tôi có một thư viện bao gồm các chức năng có thể được truyền qua 1 mô hình để hoạt động hoặc nhiều mô hình.Quy ước Javascript cho các đối số độ dài thay đổi
Với khí hậu là một vài thư viện javascript rất phổ biến, tôi tò mò; liệu tôi có tuân theo 'tiêu chuẩn defacto' bằng cách đạt được yêu cầu 'một mục hoặc danh sách' của tôi hay không, bằng cách liệt kê biến đối số, hoặc bằng cách cho phép một trong các đối số là một mảng?
Kịch bản 1: Lập luận liệt kê
// passing a single entity to my function
sendMail(email, recipient1);
// passing multiple entities to my function
sendMail(email, recipient1, recipient2);
Kịch bản 2: đối số thực thể là một trong hai trường hợp duy nhất, hoặc mảng
// pass a single entity
sendMail(email, recipient1);
// passing multiple entities
sendMail(email, [recipient1, recipient2]);
Tôi đã thấy khu vực của jQuery mà sử dụng 'kịch bản 2 ', nhưng tôi vẫn muốn hỏi - cách tiếp cận nào là phổ biến nhất, và tại sao?
Cảm ơn
[EDIT]
Một vài ý kiến đã theo bối cảnh đó, việc sử dụng một lập luận phản đối - đó là tương tự như 'kịch bản 2' - nhưng tôi cảm thấy nó giới thiệu sự phức tạp không cần thiết - các các yếu tố không cần phải được đặt tên, bởi vì chúng chỉ là một danh sách độ dài thay đổi. Tôi nghĩ tôi sẽ thêm vào đây trong trường hợp câu hỏi của tôi không đủ rõ ràng.
[EDIT]
tôi thấy mã như thế này suốt jQuery-1-7.js
queue: function(elem, type, data) {
var q;
if (elem) {
type = (type || "fx") + "queue";
q = jQuery._data(elem, type);
// Speed up dequeue by getting out quickly if this is just a lookup
if (data) {
if (!q || jQuery.isArray(data)) {
q = jQuery._data(elem, type, jQuery.makeArray(data));
} else {
q.push(data);
}
}
return q || [];
}
}
[EDIT]
Sau khi thảo luận với JP, tôi đến với điều này - mà tôi không nói là lựa chọn đúng, nhưng nó rất linh hoạt ...
lastArgumentAsParams: function()
{
var callerArgs = jQuery.makeArray(this.lastArgumentAsParams.caller.arguments);
// return empty set if caller has no arguments
if (callerArgs.length == 0)
return [];
callerArgs.splice(0, callerArgs.length - 1)
// remove all but the last argument
if (callerArgs.length == 1 && jQuery.isArray(callerArgs[0]))
return callerArgs[0];
else
return callerArgs;
}
Nếu bạn gọi chức năng ở đầu của bất kỳ chức năng - nó sẽ xử lý arg cuối cùng trong người gọi như là một 'đối số chiều dài biến' - hỗ trợ bất kỳ của các công ước.
Ví dụ, tôi có thể sử dụng nó như thế này
function sendEmail(body, recipients)
{
recipients = lastArgumentAsParams();
// foreach(recipient in recipients)...
}
Bây giờ, tôi có thể gọi là 'SendEmail' trong bất kỳ trong các cách sau và nó sẽ làm việc như mong đợi
sendEmail('hello world', "[email protected]");
sendEmail('hello world', "[email protected]", "[email protected]");
sendEmail('hello world', ["[email protected]", "[email protected]"]);
Lưu ý: một lần nữa: "đối số đối số" khi bạn nói, khác với câu trả lời của tôi và câu trả lời của Uzi. –
Tôi đã chỉnh sửa câu trả lời của mình để hy vọng xóa sự nhầm lẫn. –
Tôi thích nếu chúng ta không nhầm lẫn mẫu đối tượng được đặt tên với các danh sách độ dài thay đổi. Danh sách độ dài biến làm cho tôi nghĩ về những thứ như printf, có thể lấy bất kỳ số lượng đối số nào, trong khi đối số từ khóa là tuyệt vời cho các đối số và đối số tùy chọn có thể thay đổi thứ tự. Dù sao nó có lẽ sẽ là tốt nhất nếu JS giống như Python, nơi bạn có thể trộn và kết hợp hai kiểu. – hugomg