Tengo una función de JavaScript estático que puede tomar 1, 2 o 3 parámetros:
function getData(id, parameters, callback) //parameters (associative array) and callback (function) are optional
Sé que siempre puedo probar si un parámetro dado no está definido, pero ¿cómo podría saber si lo que se pasó fue el parámetro o la devolución de llamada?
¿Cuál es la mejor manera de hacer esto?
Ejemplos de lo que se podría pasar:
1:
getData('offers');
2:
var array = new Array();
array['type']='lalal';
getData('offers',array);
3:
var foo = function (){...}
getData('offers',foo);
4:
getData('offers',array,foo);
javascript
jd.
fuente
fuente
Respuestas:
Puede saber cuántos argumentos se pasaron a su función y puede verificar si su segundo argumento es una función o no:
También puede usar el objeto de argumentos de esta manera:
Si está interesado, eche un vistazo a este artículo de John Resig, sobre una técnica para simular la sobrecarga de métodos en JavaScript.
fuente
Er, eso implicaría que estás invocando tu función con argumentos que no están en el orden correcto ... que no recomendaría.
En su lugar, recomendaría alimentar un objeto a su función de la siguiente manera:
Beneficios:
Inconvenientes:
Si no tiene otra opción, podría usar una función para detectar si un objeto es realmente una función (vea el último ejemplo).
Nota: Esta es la forma correcta de detectar una función:
fuente
Por lo tanto, use el operador typeof para determinar si el segundo parámetro es una matriz o función.
Esto puede dar algunas sugerencias: http://www.planetpdf.com/developer/article.asp?ContentID=testing_for_object_types_in_ja
No estoy seguro de si esto es trabajo o tarea, por lo que no quiero darle la respuesta en este momento, pero el tipo de ayuda lo ayudará a determinarlo.
fuente
Debe verificar el tipo de parámetros recibidos. Tal vez debería usar la
arguments
matriz, ya que el segundo parámetro a veces puede ser 'parámetros' y a veces 'devolución de llamada' y nombrarlos parámetros puede ser engañoso.fuente
Sé que esta es una pregunta bastante antigua, pero recientemente me ocupé de esto. Déjame saber lo que piensas de esta solución.
Creé una utilidad que me permite escribir argumentos y dejarlos ser opcionales. Básicamente, envuelve su función en un proxy. Si omite una discusión, no está definida . Puede ser peculiar si tiene múltiples argumentos opcionales con el mismo tipo uno al lado del otro. (Hay opciones para pasar funciones en lugar de tipos para hacer verificaciones de argumentos personalizados, así como especificar valores predeterminados para cada parámetro).
Así es como se ve la implementación:
Para mayor claridad, esto es lo que está sucediendo:
Puede ver el código proxy de arranArgs en mi repositorio de GitHub aquí:
https://github.com/joelvh/Sysmo.js/blob/master/sysmo.js
Aquí está la función de utilidad con algunos comentarios copiados del repositorio:
fuente
Te recomiendo que uses ArgueJS .
Simplemente puede escribir su función de esta manera:
Por sus ejemplos, consideré que desea que su
id
parámetro sea una cadena, ¿verdad? Ahora,getData
requiere unString id
y está aceptando los opcionalesObject parameters
yFunction callback
. Todos los casos de uso que haya publicado funcionarán según lo esperado.fuente
Puede usar la propiedad del objeto de argumentos dentro de la función.
fuente
¿Está diciendo que puede tener llamadas como estas: getData (id, parámetros); getData (id, devolución de llamada)?
En este caso, obviamente no puede confiar en la posición y debe confiar en analizar el tipo: getType () y luego, si es necesario, getTypeName ()
Compruebe si el parámetro en cuestión es una matriz o una función.
fuente
Creo que quieres usar typeof () aquí:
fuente
Si su problema es solo con la sobrecarga de funciones (debe verificar si el parámetro 'parámetros' es 'parámetros' y no 'devolución de llamada'), le recomendaría que no se preocupe por el tipo de argumento y
utilice este enfoque . La idea es simple: use objetos literales para combinar sus parámetros:
fuente
Supongo que este puede ser un ejemplo que se explica por sí mismo:
fuente
¿Se puede anular la función? ¿Esto no funcionará?
fuente