Estoy obteniendo más en el desarrollo de Javascript y quiero asegurarme de estar siguiendo las convenciones populares. Actualmente tengo una biblioteca que consta de funciones que se pueden pasar ya sea para 1 modelo para operar, o para muchos modelos.Convención de Javascript para argumentos de longitud variable
Dado el clima que algunas bibliotecas de JavaScript son muy populares, tengo curiosidad; ¿estaría cumpliendo con el 'estándar de facto' al lograr mi requisito de 'elemento único o lista de', enumerando la variable de argumentos, o permitiendo que uno de los argumentos sea una matriz?
Escenario 1: argumento enumeración
// passing a single entity to my function
sendMail(email, recipient1);
// passing multiple entities to my function
sendMail(email, recipient1, recipient2);
Escenario 2: argumento entidad está ya sea sola instancia, o la matriz de
// pass a single entity
sendMail(email, recipient1);
// passing multiple entities
sendMail(email, [recipient1, recipient2]);
he visto áreas de jQuery que utilizan 'escenario 2 ', pero aún me gustaría preguntar: ¿qué enfoque es el más popular y por qué?
Gracias
[EDIT]
Un par de comentarios han seguido el mismo orden de ideas, de utilizar un objeto arguments - que es similar a 'el escenario 2' - pero siento que introduce una complejidad innecesaria - el los elementos no necesitan ser nombrados, porque son solo una lista de longitud variable. Pensé que solo agregaría eso aquí en caso de que mi pregunta no fuera lo suficientemente clara.
[EDIT]
veo código como este a lo largo de 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]
Tras un breve debate con JP, me ocurrió con esta - lo que no digo es la elección correcta, pero es muy flexible ...
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;
}
Si llama esto función al comienzo de cualquier función - tratará la última arg en la persona que llama como un 'argumento de longitud variable' - soportará cualquiera de las convenciones.
Por ejemplo, puede utilizar de esta manera
function sendEmail(body, recipients)
{
recipients = lastArgumentAsParams();
// foreach(recipient in recipients)...
}
Ahora, puedo llamar 'sendEmail' en cualquiera de las siguientes maneras y funcionará como se espera
sendEmail('hello world', "[email protected]");
sendEmail('hello world', "[email protected]", "[email protected]");
sendEmail('hello world', ["[email protected]", "[email protected]"]);
Nota: una vez más: la "objeto de argumentos" como dices, es diferente tanto de mi respuesta como de la de Uzi. –
He editado mi respuesta para aclarar la confusión. –
Preferiría que no confundiéramos el patrón del objeto nombrado con las listas de longitud variable. Las listas de longitud variable me hacen pensar en cosas como printf, que puede tomar cualquier cantidad de argumentos, mientras que los argumentos de palabra clave son geniales para argumentos opcionales y argumentos que pueden cambiar el orden. De todos modos, probablemente sería mejor si JS fuera como Python, donde puedes mezclar y combinar los dos estilos. – hugomg