2010-02-09 28 views
22

Pregunta: ¿Cuál es la forma correcta de definir una función en JavaScript que tome parámetros opcionales?En JavaScript, ¿cómo puedo crear una función con un parámetro opcional?

Por ejemplo:

function myFunc(optionVar1) { 
    if(optionVar1 == undefined) { 
     ... 
    } else { 
     ... 
    } 
} 

myFunc('10'); // valid function call 
myFunc();  // also a valid function call 

¿Es apropiado usar una marca ? como Ruby en la declaración de la función como tal para denotar los parámetros opcionales:

function myFunc(optionVar1?) {...} // <--- notice the ? mark 
+0

He actualizado mi respuesta a continuación, pero la respuesta corta es no, el signo de interrogación no es un carácter permitido para un nombre de variable. – Damovisa

Respuesta

2

La primera respuesta de Google descubrí:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions (enlace roto)

No he visto ninguna instancia en la que se use un signo de interrogación para alertar a un llamante sobre un parámetro opcional. Si bien está hecho en otros idiomas, no creo que sea necesario en javascript.

De hecho, it seems that you can't use a question mark in the variable name. Solo letras, números, $ y _.

+0

Desafortunadamente, el artículo no es de ayuda. – SeanD

+0

Lo siento, he actualizado mi respuesta. – Damovisa

+0

Qué lástima. Que la declaración del argumento permitió denotar qué parámetro son y no son necesarios. – SeanD

53

No hay sintaxis en Javascript que especifique que un parámetro es opcional (o obligatorio). Todos los parámetros son opcionales Si no están especificados, son undefined, por lo que debe verificarlo. Por ejemplo, esta función será, en efecto, crear un valor predeterminado de 10 para el parámetro:

function myfunc(someParam) { 
    if (someParam === undefined) { 
    someParam = 10; 
    } 
    ... 
} 

También se puede acceder a los parámetros de programación utilizando la propiedad arguments.

Por último, si tiene más de unos 3-4 parámetros, en general, es recomendable utilizar un objeto anónimo en su lugar.

+1

Esto se puede simplificar en ES6 'function myfunc (someParam = 10) {Todo el código ...}' – Tim

0

Simplemente no defina la función con ningún parámetro y acceda a la matriz de argumentos especiales desde la función donde desea que estén los parámetros opcionales. Ejemplo a continuación.

<HTML> 
<HEAD> 
<SCRIPT Language="JavaScript"> 
function foo() { 
    var argv = foo.arguments; 
    var argc = argv.length; 
    for (var i = 0; i < argc; i++) { 
    alert("Argument " + i + " = " + argv[i]); 
    } 
} 
</SCRIPT> 
</HEAD> 
<BODY onload="foo('hello', 'world');"> 
</BODY> 
</HTML> 
+0

Esto doesn ' Sin embargo, ayuda a las personas a saber qué parámetros deberían incluirse. Parece kludgy – SeanD

+0

nada que un buen comentario de funciones no pueda manejar: p – James

7

Actualmente, todos los parámetros son opcionales en las funciones JS. No hay advertencia o error si omite un parámetro.

Puede establecer valores predeterminados como

function throw_cat(dist){ 
    dist = typeof dist=='undefined' ? 20 : dist; 
    //OR 
    dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default 
    //etc... 
    } 
+1

'typeof' devuelve una cadena. Use 'typeof dist === 'undefined'', o, mi preferencia, simplemente' dist === undefined'. – bobince

+0

Gracias, no estoy nada claro al respecto. En algunos contextos (es decir, fuera de una función), al hacer 'if (randomvar == undefined)' produce un error - 'ReferenceError: randomvar no está definido', así que voy con typeof. Añadiré las comillas. – JAL

1

Algunas fuentes le dirá que no tome parámetros por completo y en su lugar hacer uso de la matriz de argumentos. Esto le permite tomar cualquier entrada que se le proporcione a su función, y puede decidir cómo responder a los argumentos pasados ​​a su función como mejor le parezca.

Puede leer más sobre esto aquí: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html

+1

el enlace está roto ... –

1

Cletus y Damovisa ha hecho buenas sugerencias.También me gustaría añadir que algunos (como yo) podrían preferir una notación de esta manera:

function foo(/*bar*/) { 
    if (arguments.length == 1) { 
     var bar = arguments[0]; 
     ... 
    } 
} 

Esto sirve para documentar a los desarrolladores de su base de código que el argumento es opcional y también documenta el nombre, sino que también impide que el argumento de aparecer en el nombre de la función en un depurador (el ejemplo se mostraría como foo() en lugar de foo (optional_argument). de lo contrario, los desarrolladores que están consumiendo la API podría suponer que se requiere.

Editar: Esto es especialmente útil para argumentos opcionales que están destinados a ser utilizados internamente.

0

Is it proper to use a ? mark like Ruby in the function declaration

No, no hay manera basado en el lenguaje denota una Arg opcional. Definitivamente creo que vale la pena indicar en un comentario, sin embargo:

function myFunc(var1, var2 /* optional */, var3 /* optional */) { 
    if (var2===undefined) ... 

(Nota del triple es igual para la prueba exacta igualdad de lo contrario un null valor pasado también coincidirá Por lo general, quiere === para la mayoría de las comparaciones en JS, como.. los dobles iguales es indeseable de tipo débil)

Para cuando se tiene un número indeterminado de argumentos opcionales, por lo general, se omiten de la declaración de la función, y de nuevo un comentario es de buena educación:.

function myFunc(var1 /* , optional var2..varN */) { 
    for (var i= 1; i<arguments.length; i++) ... 
3

En primer lugar, todos los que escriben JavaScript, hazte un favor y ve a través de Learning Advanced JavaScript desde John Resig.

function myFunc(arg1, arg2 /* varargs... */) { 
    var optional = Array.prototype.slice.call(arguments, 2); 

Cada parámetro a una función es "opcional", incluso los que se declara en la lista de parámetros de la declaración de la función.

Sólo considere documenting bien.

2

Puede utilizar la anotación como {Object =} o {número =} en la sección de comentarios cuando se utiliza un doclet:

 
/** 
* @param {object=}xyz 
*/ 

IDE moderno sabe reconocer las anotaciones JavaScript y aparecen indicaciones sobre problemas potenciales en tu código

Ejemplo:

/** 
* 
* @param query 
* @param callback 
* @param {number=} ttl optional time-to-leave 
*/ 
loadByJSONP:function loadByJSONP(query, callback, ttl) { 
    ...do some work 
} 

En este ejemplo 'ttl' es opcional. la anotación {number =} indica a IDE que este parámetro es opcional. En consecuencia, cuando llame a esta función solo con dos parámetros, no recibirá una advertencia.

Anotaciones también se puede utilizar para designar el tipo esperado. esto hace que tu código sea mejor y menos propenso a errores. Aquí está el enlace para anotaciones:

https://developers.google.com/closure/compiler/docs/js-for-compiler

Cuestiones relacionadas