Я больше разбираюсь в разработке javascript и хочу убедиться, что я следую популярным соглашениям.
В настоящее время у меня есть библиотека, которая состоит из функций, которым можно передать либо одну модель для работы, либо множество моделей.
Учитывая, что несколько библиотек javascript очень популярны, мне любопытно; я бы соответствовал «стандарту де-факто», выполнив мое требование «один элемент или список», перечислив переменную arguments или позволив одному из аргументов быть массивом?
Сценарий 1: перечисление аргументов
// passing a single entity to my function
sendMail( email, recipient1 );
// passing multiple entities to my function
sendMail( email, recipient1, recipient2 );
Сценарий 2: аргумент сущности является либо единичным экземпляром, либо массивом
// pass a single entity
sendMail( email, recipient1 );
// passing multiple entities
sendMail( email, [recipient1, recipient2] );
Я видел области jQuery, в которых используется «сценарий 2», но я все же хотел бы спросить - какой подход наиболее популярен и почему?
Спасибо
[EDIT]
Несколько комментариев следовали тому же принципу использования объекта аргументов - который похож на «сценарий 2» - но я чувствую, что он вносит ненужную сложность - элементы не нужно называть по именам, потому что они просто переменные длина списка. Я подумал, что просто добавлю это здесь, если мой вопрос не был достаточно ясен.
[EDIT]
Я вижу такой код через 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]
После некоторого обсуждения с JP я пришел к такому выводу - я не говорю, что это правильный выбор, но он очень гибкий ...
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;
}
Если вы вызываете эту функцию в начале любой функции - она будет обрабатывать последний аргумент в вызывающей стороне как «аргумент переменной длины» - поддерживая любое из соглашений.
Например, я могу использовать это так
function sendEmail( body, recipients )
{
recipients = lastArgumentAsParams();
// foreach( recipient in recipients )...
}
Теперь я могу вызвать 'sendEmail' любым из следующих способов, и он будет работать как положено
sendEmail('hello world', "bill@microsoft.com" );
sendEmail('hello world', "bill@microsoft.com", "steve@apple.com" );
sendEmail('hello world', ["bill@microsoft.com", "steve@apple.com"] );