Puede pasar todos sus argumentos opcionales en un objeto como primer argumento. El segundo argumento es tu devolución de llamada.Ahora se puede aceptar tantos argumentos como que quiere en su primer objeto argumento, y que sea opcional, así:
function my_func(op, cb) {
var options = (typeof arguments[0] !== "function")? arguments[0] : {},
callback = (typeof arguments[0] !== "function")? arguments[1] : arguments[0];
console.log(options);
console.log(callback);
}
Si usted lo llama sin pasar el argumento opciones, se usará por defecto un objeto vacío:
my_func(function() {});
=> options: {}
=> callback: function() {}
Si usted lo llama con el argumento de opciones de obtener todos sus parametros:
my_func({param1: 'param1', param2: 'param2'}, function() {});
=> options: {param1: "param1", param2: "param2"}
=> callback: function() {}
obviamente, esto podría ser ajustado para trabajar con más argumentos que dos, pero conseguir más de los co nfusing. Si puede usar un objeto como su primer argumento, entonces puede pasar una cantidad ilimitada de argumentos usando ese objeto. Si necesita absolutamente más argumentos opcionales (por ejemplo, my_func (arg1, arg2, arg3, ..., arg10, fn)), le sugiero que use una biblioteca como ArgueJS. No lo he usado personalmente, pero parece prometedor.
undefined es una propiedad global con un valor constante, por lo que no es necesario que la cites. En navegadores obsoletos, podría establecer accidentalmente un valor arbitrario, pero este no es el caso de los navegadores de hoy en día. – andreszs
@Andrew: 'typeof' siempre devuelve una cadena. Alternativamente, 'if (opciones === undefined)' funcionaría también. Pero como dijiste, es posible anular 'undefined' en navegadores más antiguos, por lo que la práctica prevalente (creo) es no usar' indefinido' (a menos que hayas definido explícitamente alguna parte). –
no compare cadenas con '===', no es necesario tener el mismo objeto si tiene el mismo contenido. – inetphantom